Pregunta

Estoy usando srandom() y random() para generar números aleatorios en c en un sistema Unix.Me gustaría tener varios RNG.Cada uno, dada la misma semilla, debería generar la misma secuencia.También me gustaría guardar y restaurar el estado de cada uno.A continuación se muestra un ejemplo de pseudocódigo:

R1 = new_rng(5); //5 is the seed
R2 = new rng(5); //5 is the seed here, too.
a = R1.random();
b = R1.random();
d = R2.random(); //a == d
s1 = R2.get_state(); //save the state of R2
e = R2.random(); //b == e
R2.set_state(s1); //restore the state of R2
f = R2.random(); //b == f

¿Cómo hago esto?A veces, los RNG se bifurcan en diferentes subprocesos y también necesito replicar el estado del RNG al crear un nuevo subproceso.

¿Fue útil?

Solución

Utilice erand48() / nrand48() / jrand48() para generar doble punto flotante de precisión, de largo entero no negativo, o números aleatorios largo de enteros con signo, respectivamente. Estas funciones le permiten tener tantas secuencias independientes como se desee; el estado se pasa como un argumento y puede ser fácilmente guardado y restaurado. Además, la secuencia se define por la norma y no variar a través de carreras, incluso en diferentes plataformas.

Algunas otras respuestas sugieren rand_r() . Esta función es obsoleta en POSIX.1-2008, que contiene esta nota:

  

El drand48() función proporciona un generador de números aleatorios mucho más elaborado.

     

Las limitaciones sobre la cantidad de estado que se puede llevar entre una llamada de función y otro significan el <=> función nunca puede ser implementado de una manera que satisface todos los requisitos de un generador de números pseudo-aleatorio. Por lo tanto esta función debe evitarse siempre tienen que ser cumplido los requisitos no triviales (incluyendo la seguridad).

     

El <=> función puede ser retirado en una versión futura.

Otros consejos

este artículo en Mersenne Twister . Hay enlaces a varias implementaciones en la parte inferior. (En otras palabras, implementar un PRNG sí mismo.)

hay alguna extensión biblioteca C en varios sabores UNIX:

  • BSD como aleatoria, comprobar initstate / setstate
  • variantes _r (random_r, srandom_r, initstate_r, etc)
  • rand_r (stdlib.h)

qué sabor es compatible con el objetivo de UNIX?

Usar rand_r(unsigned *seed) en lugar de srand() y rand().De esa manera puedes mantener múltiples semillas aleatorias.

No estoy seguro de que puede confiar en su PRNG para producir la misma secuencia exacta dada una semilla idéntica realidad. Sé que algunos métodos funcionan de esa manera, pero creo que algunos de los mejores que incluyen una cierta cantidad de no determinismo, de modo que una semilla idéntica puede dar lugar a una secuencia diferente. Vas a tener que ir a través de la documentación de libc con un peine de dientes finos y ver si esto se menciona en alguna parte. Si no es así, compruebe el código (si eres tan afortunado de tener acceso al código).

En cualquier caso, esta voluntad par su aplicación muy bien hecho, con la aplicación PRNG en su libc. Definitivamente estará obligado al sabor de libc está desarrollando en, y tal vez incluso la versión de libc. Si esta característica es muy importante, es posible que tenga que volver a implementar la generación de números aleatorios en su aplicación para asegurar la portabilidad y la reproducibilidad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top