Cómo generar una serie de números aleatorios con el preprocesador C / C ++

Me gustaría generar una serie de números aleatorios con el preprocesador de C y almacenarlos en variables para que los utilice mi progtwig.

OBJETIVOS:

Me gustaría generar un conjunto “único” de números aleatorios cada vez que construyo mi progtwig. Un pequeño subconjunto de las variables que almacenan los números aleatorios se sobrescribirá con números significativos (es decir, no aleatorios). Me gustaría que fuera imposible para un hacker, depurando el progtwig o comparando múltiples construcciones, para poder diferenciar los números significativos de los números aleatorios. Me gustaría que el proceso de construcción fuera automatizado y autónomo. Me gustaría que la implementación sea portátil en Visual Studio y GCC.

ACLARACIONES:

  1. Los cálculos deben realizarse en tiempo de comstackción, no en la ejecución del progtwig. Cualquiera que esté depurando el progtwig solo debería poder ver, por ejemplo, una variable que se está inicializando en una constante (el número aleatorio).
  2. Los números aleatorios deben ser enteros.
  3. El generador de números aleatorios se debe __DATE__ , de alguna manera, a partir de __DATE__ y __TIME__ , de modo que las diferentes comstackciones produzcan diferentes números aleatorios.
  4. Sería preferible, pero no absolutamente necesario, poder especificar un rango para los números aleatorios (por ejemplo, de 1 a 100).
  5. Sería preferible, pero no absolutamente necesario, poder especificar el número total de números aleatorios que se generarán (por ejemplo, declarar 1000 variables e inicializar cada una de ellas a un número aleatorio).

INTENTOS HASTA LEJOS:

  1. Subproceso anterior sobre aritmética en el preprocesador: ¿Puede el preprocesador C realizar aritmética de enteros? La conclusión es que la condición #if puede evaluar la aritmética.
  2. La búsqueda en Google revela que además de la aritmética, las operaciones de cambio y bit también pueden ser evaluadas por el #if. He confirmado esto con Visual Studio C ++.
  3. Candidatos para generadores de números aleatorios simples: http://www.ciphersbyritter.com/NEWS4/RANDC.HTM#369B5E30.65A55FD1@stat.fsu.edu Cualquiera de estos generadores, o cualquier generador que sea imposible de revertir por ingeniería series de números aleatorios, estaría bien porque no necesito un generador especialmente bien comportado. Por el bien de este ejercicio, podemos usar lo siguiente como ejemplo:

     unsigned long jcong=380116160; #define CONG (jcong=69069*jcong+1234567) 
  4. Creo que el problema básico es que hay un estado que se almacena en la variable jcong entre llamadas sucesivas al generador. La asignación de variables no se admite en el preprocesador, que yo sepa. Tal vez hay alguna macro recursiva inteligente que puede hacer el truco?

  5. Lo más cerca que pude acercarme, pero no cumpliendo con mi objective de ser realizado por el preprocesador, es:

     unsigned long jcong=380116160; unsigned long randomBlock[] = {jcong=69069*jcong+1234567, jcong=69069*jcong+1234567}; 

    He confirmado en Visual Studio C ++ que, de hecho, esto inicializa los miembros de la matriz a diferentes números aleatorios. Sin embargo, el depurador todavía pasa por la inicialización.

Esta es una pregunta de progtwigción / implementación pura, así que, por favor, no haga proselitismo sobre los males del preprocesador o la inutilidad de luchar contra piratas informáticos.

Entonces, aquí está la solución que está cerca de los requisitos:

 // pprand.h #include  #ifndef PP_RAND_SEED #define PP_RAND_SEED (((PP_RAND_MIN + PP_RAND_MAX) * 0x1f7) ^ 0x1e3f75a9) #endif #define BOOST_PP_VALUE ((PP_RAND_SEED * 214013 + 2531011) % 65536) #include BOOST_PP_ASSIGN_SLOT(1) #undef BOOST_PP_VALUE #undef PP_RAND_SEED #define PP_RAND_SEED BOOST_PP_SLOT(1) #define BOOST_PP_VALUE (PP_RAND_MIN + PP_RAND_SEED % (PP_RAND_MAX - PP_RAND_MIN)) #include BOOST_PP_ASSIGN_SLOT(2) #undef BOOST_PP_VALUE #ifdef PP_RAND #undef PP_RAND #endif #define PP_RAND BOOST_PP_SLOT(2) 

Puedes usarlo así:

 // Pseudo random number range. #define PP_RAND_MIN 0 #define PP_RAND_MAX 100 // Pseudo random number seed. #define PP_RAND_SEED 123 #include "pprand.h" // Got it! #pragma message("PP_RAND value:" _CRT_STRINGIZE(PP_RAND)) 

Para leer más sobre este enfoque, visite mi blog: http://alexander-stoyan.blogspot.com/2012/07/getting-pseudo-random-numbers-at.html

Debe reemplazar la secuencia del generador aleatorio con algo que realmente genere valores semi-aleatorios aceptables, pero esa parte debería ser fácil.

Tienes que definir una semilla aleatoria con -DSEED=... en la comstackción. No tengo idea de cómo hacerlo con __TIME__ y __DATE__ porque son cadenas.

 #include  template  struct Random { enum { value = 7 * Random::value + 17 }; }; template <> struct Random<1> { enum { value = SEED}; }; template  struct RandomIn { enum { value = BEG + Random::value % (END-BEG) }; }; int main() { printf("%d %d", RandomIn<2, 5, 10>::value, RandomIn<3, 5, 10>::value); return 0; }