¿Cómo funciona el generador de números aleatorios en C?

Estoy tratando de generar un número aleatorio entre 0 y 40 (inclusive). Así que el código que implementé es este

y=rand()%41; 

Sin embargo cada vez que hago clic en comstackr y pulsa Ejecutar. Da salida a los mismos números aleatorios. Como en, por ejemplo, ejecuté esto en un bucle.

 for(i=0;i<4;i++) { y=rand()%41; printf("%d ",y); } 

Cada vez, la salida es los mismos 4 números. Siempre da salida a 14,2, etc, etc. en el terminal. No importa qué.

Así que mi primera pregunta es, ¿por qué sucede esto?

y en segundo lugar, ¿cómo funciona el generador de números aleatorios en C?

Pensé que desde que incluyo time.h library, los números se generan a través de un algoritmo estándar que usa la hora del sistema. Y dado que la hora del sistema cambia continuamente, los números que se generan también deben cambiar cada vez que ejecuto el progtwig.

rand() genera solo números pseudoaleatorios. Esto significa que cada vez que ejecute su código obtendrá exactamente la misma secuencia de números.

Considere usar

 srand(time(NULL)) 

Para obtener cada vez diferentes números. De hecho una posible implementación para rand es

 next = next * 1103515245 + 12345; return (UINT32)(next>>16) & RAND_MAX; 

donde next se define como

 static UINT32 next = 1; 

Llamar a srand() tiene el efecto de cambiar el valor inicial de next , cambiando así el valor “next” que obtienes como resultado.

En cuanto a cómo funciona, depende. Muchas implementaciones utilizan un generador lineal congruente , con diferentes parámetros.

El algoritmo utilizado para rand no está especificado por el estándar C,

Por especificación, si no llama srand antes de una llamada a rand en su progtwig, es como si se llamara srand(1) : el valor de semilla será 1 en cada ejecución del progtwig y la secuencia generada será siempre la mismo.

Una forma común de tener diferentes semillas para diferentes ejecuciones del progtwig es usar una semilla que depende de la hora actual, como:

 srand(time(NULL)); 

Esto es en realidad un FAQ en comp.lang.c. Aquí está la solución que sugieren:

 (int)((double)rand() / ((double) RAND_MAX + 1) * N ) 

Donde N es el techo de tu rango de números aleatorios. Esto se debe a que los bits de orden inferior en los comstackdores de C malos son “sorprendentemente no aleatorios”. Esto no evita la necesidad de usar srand (). Sin embargo, tenga en cuenta que srand (tiempo (NULL)) debe llamarse fuera de su bucle … el tiempo () tiene una resolución de 1 segundo, por lo que llamarlo dentro del bucle reinicializará su generador de números aleatorios a la misma semilla muchas veces seguidas

La necesidad de esto es probablemente histórica, estoy seguro de que los comstackdores modernos probablemente no tienen generadores de números aleatorios que emitan números aleatorios realmente malos, pero recuerdo que escribí un progtwig que usa el comstackdor Borland C que pasaría por aproximadamente 5 números cuando Utilicé rand() % 41 repetidamente.

La razón es que rand () usa la misma siembra cada vez que corres. Tienes que sembrarlo tú mismo. srand (time (NULL)); `se usa generalmente para inicializar semillas aleatorias.

Es generado por un argumento pasado semilla. Para generar diferentes números, agregue esto antes de llamar a la función rand() :

 srand (time(NULL)); 

Esto genera una nueva semilla aleatoria.

Debería tener esta biblioteca: #include Y si todavía tiene un error, use este también: #include