Nombres pseudo-aléatoires (rand et srand)
Transcription
Nombres pseudo-aléatoires (rand et srand)
Nombres pseudo-aléatoires (rand et srand) 1 Nombres pseudo-aléatoires #include <iostream> using namespace std; #include <stdlib.h> #include <time.h> int main(int argc, char ** argv) { srand( time(0) ); cout << rand() << endl; cout << rand() << endl; return 0; Il faut ajouter #include <stdlib.h> #include <time.h> au début du programme. Il faut appeler la fonction srand une fois, avant d'utiliser la fonction rand pour la première fois. La fonction rand renvoie un nouveau nombre à chaque fois qu'elle est utilisée. } donnera par exemple: 1481765933 1085377743 2 rand() La fonction rand() retourne un nombre entier (de type int) apparemment tiré au hasard. Ce nombre est compris entre 0 et RAND_MAX, qui est une valeur définie dans le fichier stdlib.h La fonction rand() n'a pas d'argument, les parenthèses doivent néanmoins être présentes. 3 srand( ... ) La fonction srand() doit être appelée une fois, avant d'utiliser la fonction rand pour la première fois. Elle permet d'initialiser le "générateur de nombres pseudo-aléatoires". Par exemple, si on fait: srand(0); cout << rand() << endl; cout << rand() << endl; le générateur est initialisé avec la valeur 0, et les deux valeurs obtenues avec la fonction rand() seront les mêmes à chaque fois que le programme est exécuté. Si on initialise le générateur avec la valeur 1: srand(1); cout << rand() << endl; cout << rand() << endl; on obtiendra des valeurs différentes, mais ce seront toujours les mêmes à chaque fois que le programme sera exécuté. 4 srand( ... ) Pour obtenir des nombres différents à chaque exécution du programme, il faut initialiser le générateur avec une valeur différente à chaque exécution. Un moyen pratique pour cela est d'utiliser la fonction time(), qui renvoie le nombre de secondes écoulée depuis une certaine date (précisément le 1er Janvier 1970 à 00h00 UTC): srand( time(0) ); cout << rand() << endl; cout << rand() << endl; Pour pouvoir utiliser la fonction time(), il faut ajouter au début du programme: #include <time.h> 5 Exemples Comment obtenir un nombre au hasard entre 0 et 9 ? à il suffit de prendre le reste de la division par 10: int n(rand() % 10); 6 Exemples Comment obtenir un nombre au hasard entre 0 et 9 ? à il suffit de prendre le reste de la division par 10: int n(rand() % 10); Comment obtenir un nombre au hasard entre 1 et 10 ? à il suffit de prendre le reste de la division par 10, et d'ajouter 1: int n(rand() % 10 + 1); 7 Exemples Comment obtenir un nombre décimal au hasard entre 0 et 1 ? à rand() est entre 0 et RAND_MAX, il suffit de diviser rand() par RAND_MAX. Attention au piège de la division entière ! Si on fait: double x(rand() / RAND_MAX); x vaudra toujours 0, puisque: rand() et RAND_MAX sont tous les deux de type int, il s'agit donc de la division entière. Comme rand() est toujours plus petit que RAND_MAX, rand() / RAND_MAX vaut toujours 0. Il faut utiliser un cast explicit: double x(double(rand()) / RAND_MAX); 8 Exemples Comment obtenir un nombre décimal au hasard entre 0 et 1 ? à double x(double(rand()) / RAND_MAX); Comment obtenir un nombre décimal au hasard entre -1 et 1 ? à double(rand()) / RAND_MAX; est entre 0 et 1 donc 2 * double(rand()) / RAND_MAX; est entre 0 et 2 donc 2 * double(rand()) / RAND_MAX – 1; est entre -1 et 1 à double x(2 * double(rand()) / RAND_MAX – 1); 9