Generar un número aleatorio en C

Jinku Hu 12 octubre 2023
  1. Usar las funciones rand y srand para generar números aleatorios en C
  2. Usar las funciones random y srandom para generar números aleatorios en C
  3. Usar la función getrandom para generar números aleatorios en C
Generar un número aleatorio 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C Operator