Générer un nombre aléatoire en C
-
Utiliser les fonctions
rand
etsrand
pour générer des nombres aléatoires en C -
Utiliser les fonctions
random
etsrandom
pour générer des nombres aléatoires en C -
Utiliser la fonction
getrandom
pour générer des nombres aléatoires 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
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