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