Cómo generar un número aleatorio en C

Debe distinguir dos cosas: números aleatorios y pseudoaleatorios. Los números verdaderamente aleatorios representan la aleatoriedad real y no se pueden predecir. Los números pseudoaleatorios son una secuencia de números que se puede predecir conociendo la semilla y el número de secuencia. Tenga cuidado al respecto y nunca use valores pseudoaleatorios mientras genera algo que debería ser un secreto real (por ejemplo, las claves criptográficas). Los sistemas Unix generan cosas cercanas a números verdaderamente aleatorios (toman entropía de pulsaciones de teclas, paquetes de red, …) en / dev / random. Pero idealmente deberías usar un rng físico externo.

En cuanto a la parte más fácil: pseudorandoms: hay 2 funciones pseudoaleatorias estándar en libc: la más antigua: rand () y la moderna: random (). Ambos obtendrán una secuencia fija de valores a menos que se inicialicen con alguna semilla. Esto se hace con las funciones srand () / srandom () respectivamente. Por lo general, la semilla utilizada es simplemente la hora actual. Entonces es algo así

#include
#include


int main ()
{
srandom (tiempo (NULL));


x = aleatorio ();
}

Nota : No use rand() por seguridad. Si necesita un número criptográficamente seguro, consulte esta respuesta.

#include
#include

srand (tiempo (NULL)); // solo se debe llamar una vez
int r = rand (); // devuelve un entero pseudoaleatorio entre 0 y RAND_MAX

La función de biblioteca estándar está bien para la mayoría de los propósitos; Si necesita más rigor estadístico, sugiero el capítulo relevante de los Algoritmos Seminuméricos de Knuth. Entiendo que para propósitos de encriptación debes consultar textos más especializados.

Una vez que vea el pseudocódigo, verá cuán trivial es el código real; el código no es la parte difícil, la siembra decente es mucho más exigente.