Generar un número aleatorio en C
-
Usar las funciones
rand
ysrand
para generar números aleatorios en C -
Usar las funciones
random
ysrandom
para generar números aleatorios en C -
Usar la función
getrandom
para generar números aleatorios en C
Este artículo presenta varios métodos para generar números aleatorios en C.
Usar las funciones rand
y srand
para generar números aleatorios en C
La función rand
implementa un generador de números pseudo-aleatorios que puede proporcionar un número entero en el rango de [0, RAND_MAX]
, donde RAND_MAX
es 231-1 en los sistemas modernos. Tenga en cuenta que el algoritmo generador detrás de la función rand
es determinista. Por lo tanto, debe ser sembrado con bits aleatorios.
La función srand
se utiliza para sembrar el generador de números pseudo-aleatorios, y las siguientes llamadas a rand
producirán secuencias de enteros aleatorios. Por otro lado, no se espera que las implementaciones de rand
produzcan bits aleatorios uniformes. Por lo tanto, no se recomienda utilizar la función rand
en aplicaciones criptográficas altamente sensibles. El siguiente ejemplo siembra el generador con el valor de la hora actual, que no es una buena fuente de aleatoriedad.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX 100000
#define SIZE 100
#define NUMS_TO_GENERATE 10
int main() {
srand(time(NULL));
for (int i = 0; i < NUMS_TO_GENERATE; i++) {
printf("%d\n", rand() % MAX);
}
exit(EXIT_SUCCESS);
}
Producción :
85084
91989
85251
85016
43001
54883
8122
84491
6195
54793
Usar las funciones random
y srandom
para generar números aleatorios en C
Otro generador de números pseudo-aleatorios disponible en la biblioteca estándar de C se implementa bajo la función random
. Este método es el preferido en comparación con rand
, pero las aplicaciones criptográficas no deberían utilizar la función random
en código sensible. random
no toma argumentos y devuelve un entero de tipo long int
en el rango de [0, RAND_MAX]
. La función debe ser preferiblemente sembrada con la función srandom
para generar números aleatorios de relativa buena calidad.
Tenga en cuenta que, al igual que en el ejemplo anterior, utilizamos la función time
para pasar el valor de la hora actual como semilla, lo que no se recomienda en aplicaciones sensibles a la seguridad.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/random.h>
#define MAX 100000
#define SIZE 100
#define NUMS_TO_GENERATE 10
int main() {
srandom(time(NULL));
for (int i = 0; i < NUMS_TO_GENERATE; i++) {
printf("%ld\n", random() / MAX);
}
printf("\n");
exit(EXIT_SUCCESS);
}
Producción :
91
2019
2410
11784
9139
5858
5293
17558
16625
3069
Usar la función getrandom
para generar números aleatorios en C
getrandom
es una función específica de Linux para obtener bits aleatorios que son de mucha mejor calidad que los dos métodos anteriores proporcionados. getrandom
toma tres argumentos - el puntero void
que apunta al buffer donde se deben almacenar los bits aleatorios, el tamaño del buffer en bytes, y banderas para características especiales.
En el siguiente ejemplo, generamos un único entero sin signo
, cuya dirección &tmp
se pasa como el buffer para almacenar los bits aleatorios, y el tamaño se calcula con el operador sizeof
. La fuente de aleatoriedad de la que getrandom
recupera los bits puede no estar inicializada en escenarios poco frecuentes. La llamada a la función getrandom
bloqueará la ejecución del programa. Por lo tanto, la definición de la macro GRND_NONBLOCK
se pasa como tercer argumento para que la función devuelva el valor de error -1 inmediatamente en estos casos.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/random.h>
#include <time.h>
#define MAX 100000
#define SIZE 100
#define NUMS_TO_GENERATE 10
int main() {
unsigned int tmp;
getrandom(&tmp, sizeof(unsigned int), GRND_NONBLOCK) == -1
? perror("getrandom")
: "";
printf("%u\n", tmp);
exit(EXIT_SUCCESS);
}
934103271
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook