Generar números aleatorios eficazmente con rand()

Haz una pregunta

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.
Jean-François Pillou

Jean-François Pillou - Fundador de CCM
Mejor conocido como Jeff, Jean-François Pillou es el fundador de CommentCaMarche.net. También es CEO de CCM Benchmark y director digital en el Grupo Figaro.

Más información sobre el equipo de CCM

Consulta también