Generar números aleatorios eficazmente con rand()

Noviembre 2016


Generar números aleatorios eficazmente con rand()



Probablemente te has dado cuenta de que en C, al usar la función rand() de la biblioteca estándar, se obtienen resultados decepcionantes, y casi siempre los mismos.

Por ejemplo, si queremos generar 5 números aleatorios uno detrás de otro:

#include <stdlib.h>
#include <stdio.h>

int main()
{
int i;
for(i=0; i<5; i++)
{
printf("%d\n", rand());
}
return 0;
}


Ejecutamos el programa y obtenemos el siguiente resultado:

41
18467
6334
26500
19169


Notarás que los resultados son bastante diferentes, pero si volvemos a ejecutar el programa, tendremos la misma serie de números.

Para cambiar el comportamiento del generador de números aleatorios, podemos cambiar la variable sobre la que se basa para realizar los cálculos. A esta se le llama seed o semilla.
Esta semilla puede modificarse con la función srand():
srand(valor de la semilla)


Necesitamos elegir un número que no podamos predecir fácilmente y que varíe de un instante a otro. Por ejemplo, puedes usar el número de ciclos utilizados por tu procesador desde el inicio. Puede ser obtenido, en procesadores x86 (Intel, Amd, etc.), con el comando ensamblador rdtsc. La escritura de una función rdtsc() podrá facilitarte las cosas, la sintaxis siguiente funciona con GCC en Linux y la puedes encontrar con dev C++ en Windows:

#include <stdlib.h>
#include <stdio.h>

int rdtsc()
{
__asm__ __volatile__("rdtsc");
}

int main()
{
int i;
for(i=0; i<5; i++)
{
srand(rdtsc());
printf("%d\n", rand());
}
return 0;
}


Con este código, generarás números aleatorios más eficaces.

Nota: Esta solución funciona únicamente con los procesadores x86.

También evita activar optimizaciones en el compilador (opción-O1,-O2-O3, etc.) cuando utilices la función rdtsc.

Consulta también :
El documento «Generar números aleatorios eficazmente con rand()» de CCM (es.ccm.net) se encuentra disponible bajo una licencia Creative Commons. Puedes copiarlo o modificarlo siempre y cuando respetes las condiciones de dicha licencia y des crédito a CCM.