Bonjour tout le monde,
j'ai deux petites questions dont je ne trouve pas la réponse concernant la fonction rand() et srand().
J'ai bien compris que rand() est une suite pseudo aléatoire, et srand() permet de définir où le programme commence dans la séquence pseudo-alétoire. Mais il me reste deux petits points pas très clairs ... et j'aimerais vos lumières pour m'aider :-)
1) Si le nombre d'appelle à la fonction rand() dépasse RAND_MAX, il boucle et revient au début de la séquence ?
2) La séquence pseudo aléatoire dépend-elle de la machine, architecture, ou compilateur ?
3) Concernant la graine de départ de la séquence rand(). Si je regarde ceci:
alors j'obtiens :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 srand(1); for (int j=1; j<4;j++) printf("random %d = %d\n", j, rand());
random 1 = 1804289383
random 2 = 846930886
random 3 = 1681692777
Si je prends le même code en mettant srand(2) à la place de srand(1), et en n'affichant que les deux premiers résultats, soit
j'obtiens alors
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 srand(2); for (int j=2; j<4;j++) printf("random %d = %d\n", j, rand());
random 2 = 1362961854
random 3 = 8891098
Je pensais pourtant obtenir les deux mêmes résultats qu'avec srand(1), comme si la suite partait du deuxième nombre pseudo-aléatoire de la séquence. C'est-à-dire :
random 2 = 846930886
random 3 = 1681692777
Mais ce n'est pas le cas, du coup je me posais une question très naïve. Je dois lancer des simulations de Monte Carlo en multi processus avec MPI/OpenMP. Plutôt que de choisir des graines dépendant du temps et du rand du processus, suffirait-il de choisir une graine du genre srand(MPI_rank) ? Je sens bien que c'est faux et ça sent l'entourloupe à plein nez, mais ça m'interroge quand même.
Merci beaucoup pour vos réponses et bonne fin de week end !
Partager