Generando números aleatorios en C

Mientras buscaba Tutoriales para generar números aleatorios en CI, encontró este tema

Cuando trato de usar la función rand() sin parámetros, siempre obtengo 0. Cuando trato de usar la función rand() con parámetros, siempre obtengo el valor 41. Y cada vez que bash usar arc4random() y al random() funciones, me sale un error LNK2019.

Esto es lo que hice:

 #include  int main() { int x; x = rand(6); printf("%d", x); } 

Este código siempre genera 41. ¿Dónde me estoy equivocando? Estoy ejecutando Windows XP SP3 y utilizando el símbolo del sistema VS2010 como comstackdor.

Debe llamar a srand () antes de llamar a rand para inicializar el generador de números aleatorios.

O llámalo con una semilla específica, y siempre obtendrás la misma secuencia pseudoaleatoria

 #include  int main () { srand ( 123 ); int random_number = rand(); return 0; } 

o llámalo con fonts cambiantes, es decir, la función de tiempo

 #include  #include  

En respuesta a Moon’s Comment rand () genera un número aleatorio con una probabilidad igual entre 0 y RAND_MAX (una macro predefinida en stdlib.h)

Puede asignar este valor a un rango más pequeño, por ejemplo

 int random_value = rand(); //between 0 and RAND_MAX //you can mod the result int N = 33; int rand_capped = random_value % N; //between 0 and 32 int S = 50; int rand_range = rand_capped + S; //between 50 and 82 //you can convert it to a float float unit_random = random_value / (float) RAND_MAX; //between 0 and 1 (floating point) 

Esto podría ser suficiente para la mayoría de los usos, pero vale la pena señalar que en el primer caso el uso del operador de mod introduce un ligero sesgo si N no se divide uniformemente en RAND_MAX + 1.

Los generadores de números aleatorios son interesantes y complejos, se dice ampliamente que el generador rand () en la biblioteca estándar C no es un generador de números aleatorios de gran calidad, lea ( http://en.wikipedia.org/wiki/Random_number_generation para obtener una definición de calidad).

http://en.wikipedia.org/wiki/Mersenne_twister (fuente http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html ) es un popular de alta calidad al azar generador de números

Además, no estoy al tanto de arc4rand () o al azar () así que no puedo comentar.

Necesita sembrar su PRNG para que comience con un valor diferente cada vez.

Una semilla simple pero de baja calidad es usar la hora actual:

 srand(time(0)); 

Esto lo ayudará a comenzar, pero se considera de baja calidad (es decir, por ejemplo, no lo use si está tratando de generar claves RSA).

Fondo. Los generadores de números pseudoaleatorios no crean secuencias de números aleatorios verdaderos, sino que simplemente los simulan. Dado un número de punto de partida, un PRNG siempre devolverá la misma secuencia de números. Por defecto, comienzan con el mismo estado interno, por lo que devolverán la misma secuencia.

Para no obtener la misma secuencia, cambia el estado interno. El acto de cambiar el estado interno se denomina “siembra”.

 #include  int main() { int x; x = rand(6); printf("%d", x); } 

Especialmente como principiante, debe pedirle a su comstackdor que imprima todas las advertencias sobre el código incorrecto que pueda generar. Los comstackdores modernos conocen muchas advertencias diferentes que te ayudan a progtwigr mejor. Por ejemplo, cuando comstack este progtwig con el comstackdor GNU C:

 $ gcc -W -Wall rand.c rand.c: In function `main': rand.c:5: error: too many arguments to function `rand' rand.c:6: warning: implicit declaration of function `printf' 

Aquí tienes dos advertencias. El primero dice que la función rand solo toma cero argumentos, no uno como lo intentó. Para obtener un número aleatorio entre 0 y n , puede usar la expresión rand() % n , que no es perfecta, pero está bien para n pequeña. Los números aleatorios resultantes normalmente no están distribuidos uniformemente; los valores más pequeños se devuelven con más frecuencia.

La segunda advertencia le dice que está llamando a una función que el comstackdor no conoce en ese momento. Tienes que decirle al comstackdor diciendo #include . Qué archivos de inclusión son necesarios para qué funciones no siempre es simple, pero pedir la especificación de Open Group para sistemas operativos portátiles funciona en muchos casos: http://www.google.com/search?q=opengroup+rand .

Estas dos advertencias le dicen mucho sobre la historia del lenguaje de progtwigción C. Hace 40 años, la definición de una función no incluía la cantidad de parámetros o los tipos de los parámetros. También estuvo bien llamar a una función desconocida, que en la mayoría de los casos funcionó. Si desea escribir código hoy, no debe confiar en estas características anteriores, sino que debe habilitar las advertencias de su comstackdor, comprender las advertencias y luego corregirlas adecuadamente.

Además, los PRNG congruentes lineales tienden a producir más aleatoriedad en los bits más altos que en los bits más bajos, por lo que para limitar el resultado, no use módulo, sino que utilice algo como:

 j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0))); 

(Este es de “Recetas Numéricas en C”, cap.7)

¡Primero necesita sembrar el generador porque no genera números aleatorios reales !

Prueba esto:

 #include  #include  

O bien, para obtener un int pseudoaleatorio en el rango de 0 a 19, por ejemplo, puede usar los bits más altos como este:

 j = ((rand() >> 15) % 20; 
 int *generate_randomnumbers(int start, int end){ int *res = malloc(sizeof(int)*(end-start)); srand(time(NULL)); for (int i= 0; i < (end -start)+1; i++){ int r = rand()%end + start; int dup = 0; for (int j = 0; j < (end -start)+1; j++){ if (res[j] == r){ i--; dup = 1; break; } } if (!dup) res[i] = r; } return res; }