Está en la página 1de 1

Rechercher

Recherche
Registrarse
Conexin

Trucos
Programacin
Lenguajes
Lenguaje C

Generar nmeros aleatorios eficazmente con rand()


Marzo 2015

Generar nmeros aleatorios eficazmente con rand()


Probablemente te has dado cuenta de que en C, al usar la funcin rand() de la biblioteca estndar, se obtienen
resultados decepcionantes, y casi siempre los mismos. Por ejemplo, si queremos generar 5 nmeros aleatorios uno
detrs 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
1846763342650019169
Notars que los resultados son bastante diferentes, pero si volvemos a ejecutar el programa, tendremos la misma serie de nmeros. Para cambiar el
comportamiento del generador de nmeros aleatorios, podemos cambiar la variable sobre la que se basa para realizar los clculos. A esta se le llama seed
o semilla. Esta semilla puede modificarse con la funcin srand():
srand(valor de la semilla)
Necesitamos elegir un nmero que no podamos predecir fcilmente y que vare de un instante a otro. Por ejemplo, puedes usar el nmero 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 funcin 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 cdigo, generars nmeros aleatorios ms eficaces. Nota: Esta solucin funciona nicamente con los procesadores x86. Tambin evita activar
optimizaciones en el compilador (opcin-O1,-O2-O3, etc.) cuando utilices la funcin rdtsc.
Este documento intitulado Generar nmeros aleatorios eficazmente con rand() de Kioskea (es.kioskea.net) esta puesto a diposicin bajo la licencia Creative Commons. Puede copiar,
modificar bajo las condiciones puestas por la licencia, siempre que esta nota sea visible.

También podría gustarte