Ferenc Deak
Me preguntaba si el rand
(http://www.cplusplus.com/reference/cstdlib/rand/) generará la misma secuencia de números aleatorios, mientras usa el misma semillacuando se ejecuta diferente libc
implementaciones, e incluso diferentes compiladores y sistemas operativos (win, linux).
Hice algunas pruebas usando varios compiladores (g ++ 4.8, g ++ 5.1 y clang) y parece que la respuesta es sí, sin embargo, no encontré ninguna mención “oficial” del algoritmo PRNG utilizado en la generación de números aleatorios de C (http://pubs.opengroup.org/onlinepubs/009604599/functions/rand.html), o si estos deben mencionarse en las normas…
Servir Laurijssen
No hay garantía en el estándar sobre lo que se generará:
De la norma:
No hay garantías en cuanto a la calidad de la secuencia aleatoria producida y se sabe que algunas implementaciones producen secuencias con bits de bajo orden angustiosamente no aleatorios. Las aplicaciones con requisitos particulares deben usar un generador que se sepa que es suficiente para sus necesidades.
chux – Reincorporar a Monica
Ni siquiera RAND_MAX
se especifica para que tenga un valor dado en las implementaciones de C, aparte de que debe ser >= 32767. Entonces rand()
en una implementación puede devolver un rango de valores diferente que en otra y, por lo tanto, una secuencia diferente.
los
rand
función calcula una secuencia de números enteros pseudoaleatorios en el rango de 0 aRAND_MAX
. C11dr §7.22.2.1 2el valor de la
RAND_MAX
macro debe ser al menos 32767. C11dr §7.22.2.1 5
RAND_MAX
que se expande a una expresión constante entera que es el valor máximo devuelto por la función rand §7.22 3
Incluso con el mismo RAND_MAX
tenga en cuenta la respuesta de @Servé Laurijssen: la secuencia de valores de rand()
puede diferenciarse.
Nota: por implicación, RAND_MAX <= INT_MAX
.
yaakov
Según https://stackoverflow.com/a/15500754/1994390 la respuesta es no. No hay garantía en diferentes implementaciones.
Desde el enlace que publicaste (posix):
If srand() is then called with the same seed value, the sequence of pseudo-random numbers shall be repeated.
. C11, §7.22.2.2 tiene la misma redacción.– PP
23 mayo 2016 a las 11:45
Sospecho que ha comparado tres implementaciones del mismo generador, dos de las cuales (las de g++) son idénticas.
– molbdnilo
23 de mayo de 2016 a las 11:58
@Lundin Esos dos discuten cómo obtener resultados consistentes en todas las plataformas, pero no discuten directamente si
rand
tiene una implementación estándar.– pjs
23 mayo 2016 a las 13:36
@pjs ¿Cómo es que no es lo mismo? El último conduce al primero.
– Lundin
23 mayo 2016 a las 13:37
@PP Eso solo dice que una sola implementación de libc debe ser consistente entre llamadas a
seed
, no es que diferentes implementaciones deban producir la misma secuencia. Además, si ese fuera el significado, entonces el estándar también tendría que proporcionar el algoritmo exacto para producir la “secuencia estándar” para que las personas puedan escribir implementaciones conformes; de lo contrario, la solicitud no es razonable.– Bakuriu
23 mayo 2016 a las 16:27