Générer un nombre aléatoire en C

Jinku Hu 12 octobre 2023
  1. Utiliser les fonctions rand et srand pour générer des nombres aléatoires en C
  2. Utiliser les fonctions random et srandom pour générer des nombres aléatoires en C
  3. Utiliser la fonction getrandom pour générer des nombres aléatoires en C
Générer un nombre aléatoire en C

Cet article présente plusieurs méthodes pour générer des nombres aléatoires en C.

Utiliser les fonctions rand et srand pour générer des nombres aléatoires en C

La fonction rand implémente un générateur de nombres pseudo-aléatoires qui peut fournir un entier dans la gamme de [0, RAND_MAX], où RAND_MAX est 231-1 sur les systèmes modernes. Notez que l’algorithme du générateur derrière la fonction rand est déterministe. Il doit donc être ensemencé avec des bits aléatoires.

La fonction rand est utilisée pour amorcer le générateur de nombres pseudo-aléatoires, et les appels ultérieurs à rand produiront des séquences d’entiers aléatoires. L’inconvénient est que les implémentations de la fonction rand ne sont pas censées produire des bits aléatoires de manière uniforme. Ainsi, il n’est pas recommandé d’utiliser la fonction rand dans des applications cryptographiques très sensibles. L’exemple suivant ensemence le générateur avec la valeur du temps actuel, qui n’est pas une bonne source d’aléa.

#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);
}

Production :

85084
91989
85251
85016
43001
54883
8122
84491
6195
54793

Utiliser les fonctions random et srandom pour générer des nombres aléatoires en C

Un autre générateur de nombres pseudo-aléatoires disponible dans la bibliothèque standard du C est implémenté sous la fonction random. Cette méthode est préférable à la méthode rand, mais les applications cryptographiques ne doivent pas utiliser la fonction random dans un code sensible. La fonction random ne prend aucun argument et retourne un entier de type long int dans la plage de [0, RAND_MAX]. La fonction devrait de préférence être ensemencée avec la fonction random pour générer des nombres aléatoires de relativement bonne qualité.

Notez que, comme dans l’exemple précédent, nous utilisons la fonction time pour passer la valeur du temps courant comme seed, ce qui n’est pas recommandé dans les applications sensibles à la sécurité.

#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);
}

Production :

91
2019
2410
11784
9139
5858
5293
17558
16625
3069

Utiliser la fonction getrandom pour générer des nombres aléatoires en C

getrandom est une fonction spécifique à Linux qui permet d’obtenir des bits aléatoires de bien meilleure qualité que les deux méthodes fournies précédemment. La fonction getrandom prend trois arguments - un pointeur void qui pointe vers le tampon où les bits aléatoires doivent être stockés, la taille du tampon en octets, et des drapeaux pour les fonctions spéciales.

Dans l’exemple suivant, nous générons un seul entier unsigned, dont l’adresse &tmp est passée comme tampon pour stocker des bits aléatoires, et la taille est calculée avec l’opérateur sizeof. La source du caractère aléatoire à partir de laquelle le getrandom récupère les bits peut être non initialisée dans de rares cas. L’appel à la fonction getrandom bloquera l’exécution du programme. Ainsi, la définition de la macro GRND_NONBLOCK est passée comme troisième argument pour que la fonction renvoie immédiatement la valeur d’erreur -1 dans ces cas.

#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
Auteur: 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

Article connexe - C Operator