two rand programming number example and c++ c random std

programming - ¿Por qué la función C++ stdlib rand() da valores diferentes para la misma semilla en todas las plataformas?



random number in c between 1 and 100 (2)

La función rand () calculará una secuencia de enteros pseudoaleatorios en el rango [0, {RAND_MAX}] con un período de al menos 2 ^ 32.

La función rand_r () calculará una secuencia de enteros pseudoaleatorios en el rango [0, {RAND_MAX}]. (El valor de la macro {RAND_MAX} será al menos 32767.)

Si se llama a rand_r () con el mismo valor inicial para el objeto apuntado por semilla y ese objeto no se modifica entre devoluciones sucesivas y llamadas a rand_r (), se generará la misma secuencia.

La función srand () usa el argumento como semilla para una nueva secuencia de números pseudoaleatorios que serán devueltos por las llamadas subsiguientes a rand (). Si se llama a srand () con el mismo valor semilla, se repetirá la secuencia de números pseudoaleatorios. Si se llama a rand () antes de que se realicen llamadas a srand (), se generará la misma secuencia que cuando se llama por primera vez a srand () con un valor semilla de 1.

La función rand () devolverá el siguiente número pseudoaleatorio en la secuencia.

Esto es lo que el estándar IEEE Std 1003.1 C dice acerca de cómo debería comportarse la función rand() . No dice nada sobre cómo se debe calcular la secuencia. En otras palabras, cada implementador es libre de elegir su propia versión de un generador de secuencia pseudo aleatorio.

Tus observaciones muestran que se han aprovechado de esa libertad.

También podría señalar que rand() es una parte de <cstdlib> que es más o menos una copia de la biblioteca estándar de C, y la nueva biblioteca le proporcionará más flexibilidad y generadores de secuencias estándar si tiene una nueva Compilador de C ++ y no depende de la interoperabilidad de C - C ++.

Entiendo que la función rand() genera números pseudoaleatorios basados ​​en la semilla que se le da, y que en una plataforma dada siempre generará la misma secuencia de números de la misma semilla, lo que quiero saber es por qué da ¿Una secuencia diferente a través de plataformas que usan la misma biblioteca? Es decir, ¿cómo se implementa rand() ?


El estándar de C ++ no especifica qué algoritmo se usa para la función rand ().

La funcionalidad está definida por quien haya escrito la biblioteca estándar en su sistema: Microsoft para la biblioteca estándar incluida con Visual Studio y los tipos de GNU para la biblioteca estándar empaquetada con GCC.

Su compilador está haciendo la elección de dónde obtiene su biblioteca, por lo que puede tener diferentes versiones de la biblioteca estándar para diferentes compiladores en el mismo sistema. El punto sigue siendo el mismo: la especificación garantiza qué funciones están disponibles y qué hacen; No como lo hacen.