[C con Clase] Numeros Aleatorios

Programante programante en gmail.com
Mar Jun 24 12:30:00 CEST 2008


Yasser Gonzalez Soto escribió:
> Como hago para generar numeros aleatrios en C
>   

Usando ansi C, pero los números no son excesivamente aleatorios: (más 
que suficiente para la mayoría de los casos)

#include <time.h>
#include <stdio.h>

int main() {
    int numero1, numero2;
    srand(time(NULL)); //Inicializar números aleatorios

    numero1 = rand(); //Número entre 0 y MAX_RAND
    numero2 = rand() % 128; //Número entre 0 y 127

    printf("%u %u\n", numero1, numero2);
    return 0;
}


Si buscamos números con mayor entropía, dependeremos del SO.
Linux:

#include <stdio.h>
#include <fcntl.h>

int main() {
    unsigned int numero1, numero2;
    int Archivo = open("/dev/random", O_RDONLY);
    read(Archivo, &numero1, sizeof(numero1)); //Número en todo el rango 
de los enteros
    read(Archivo, &numero2, sizeof(numero2));
    close(Archivo);

    numero2 = numero2 % 128; //Número entre 0 y 127

    printf("%u %u\n", numero1, numero2);
    return 0;
}

Windows:
#include <stdio.h>
#include <fcntl.h>
#include <windows.h>
#include <wincrypt.h>

int main() {
    unsigned int numero1, numero2;

  HCRYPTPROV /hProv;/

  CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);

  CryptGenRandom(hProv, sizeof(numero1), (BYTE*)&numero1); //Número en todo el rango de los enteros

  CryptGenRandom(hProv, sizeof(numero2), (BYTE*)&numero2); 

    *CryptReleaseContext* 
<http://msdn.microsoft.com/en-us/library/aa380268%28VS.85%29.aspx>(hProv, 
0);

    numero2 = numero2 % 128; //Número entre 0 y 127

    printf("%u %u\n", numero1, numero2);
    return 0;
}

Ten en cuenta que en ambos casos haría falta comprobar si hubo errores 
en cada uno de los pasos.





Más información sobre la lista de distribución Cconclase