La fonction
rand() retourne un nombre pseudo-aléatoire compris entre 0 et 32767 (= constante
RAND_MAX définie dans le fichier
stdlib.h). Ces nombres sont dits pseudo-aléatoires parce que, a priori, ils semblent aléatoires mais en fait ils sont calculés à partir d'un nombre de départ que l'on appelle la graine et qui démarre touours à la même valeur (certainement zéro j'imagine) ce qui fait que l'on obtient toujours la même série de nombres "aléatoires" à chaque exécution :
Le programme suivant :
#include <stdio.h>
#include <stdlib.h>
main()
{
for (int i=0 ; i<10 ; ++i) printf(" %d",rand());
printf("\n");
}
donne (sur mon PC) la série suivante
à chaque exécution :
41 18467 6334 26500 19169 15724 11478 29358 26962 24464
Pour éviter ce problème (qui n'en ait pas forcément un car on peut vouloir obtenir la même série aléatoire à chaque exécution !), il existe la fonction
srand() qui permet d'initialiser la fameuse graine de départ :
Le programme suivant :
#include <stdio.h>
#include <stdlib.h>
main()
{
srand(1000);
for (int i=0 ; i<10 ; ++i) printf(" %d",rand());
printf("\n");
}
donne la série suivante (différente de la précédente)
à chaque exécution :
3304 8221 26849 14038 1509 6367 7856 21362 6968 10160
Pour obtenir uune série qui ressemble vraiment à de l'aléatoire, l'astuce consiste à initialiser la graine avec la fonction
time() (dans
time.h) qui retourne l'heure du PC sous forme du nombre de secondes écoulées depuis le 1er janvier 1970 !!! Comme cela on obtient une graine différente à chaque exécution (à moins de réaliser l'initialisation 2 ou plusieurs fois dans la même seconde !) et donc des séries de nombres aléatoires différents :
Le programme suivant :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
srand((unsigned int)time(NULL));
for (int i=0 ; i<10 ; ++i) printf(" %d",rand());
printf("\n");
}
donne maintenant une série différente
à chaque exécution :
23676 2545 31071 21600 21869 12870 31019 21473 7807 13205
23745 31654 13003 2642 9100 29795 30845 25536 26871 15168
23810 17246 9838 25156 18783 10026 27558 32526 29422 23278
23879 13586 24538 6198 6013 26951 27383 3822 15718 25241
...
Le cast avec
(unsigned int) est là parce que
srand() attend une valeur de type
unsigned int et que
time() renvoie une valeur de type
time_t. Le
NULL dans
time() est là parce qu'on ne veut pas stocker le compteur de secondes (sinon il y aurait l'adresse de la variable réceptrice).
Pour obtenir des nombres aléatoires compris entre un minimum et un maximum autres que 0 et 32767, il suffit de faire :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
srand((unsigned int)time(NULL));
int min = 10;
int max = 20;
for (int i=0 ; i<10 ; ++i) printf(" %d",(rand() % (max - min)) + min);
printf("\n");
}
Exemple : 12 19 13 11 19 11 13 19 19 19
Voilà !!!Jean-François