rand( ) et srand( )

Le
prat
Bonjour,

En C,quand on utilise la fonction rand( ) elle doit être utilisée avec
la fonction srand( ) de manière lors de chaque exécution du programme,
rand( ) ne donne pas le même nombre aléatoire.
Ma question est:
pourquoi au cours d'une et une seule exécution du programme,même après
avoir introduit srand( ),quand on utlilise plusieurs fois rand( ) dans
une même fonction(par exemple tirage de plusieurs nombres
aléatoires),ça ne donne pas le même nombre aléatoire?

merci.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Eric Levenez
Le #982617
Le 27/02/07 16:54, dans

En C,quand on utilise la fonction rand( ) elle doit être utilisée avec
la fonction srand( ) de manière lors de chaque exécution du programme,
rand( ) ne donne pas le même nombre aléatoire.


Oui.

Ma question est:
pourquoi au cours d'une et une seule exécution du programme,même après
avoir introduit srand( ),quand on utlilise plusieurs fois rand( ) dans
une même fonction(par exemple tirage de plusieurs nombres
aléatoires),ça ne donne pas le même nombre aléatoire?


La norme indique que pour une même graine passée à srand, la suite de nombre
pseudo-aléatoire retournée par rand est identique. Le comportement que tu
décris est non conforme.

Montre le code qui te fait ce problème. Indique quelle plateforme tu
utilises, quelle version de compilateur et comment tu compiles.

--
Éric Lévénez -- Unix is not only an OS, it's a way of life.

Jacques VALLOIS
Le #982616
Eric Levenez déclara le mardi 27 février 2007 18:38 dans
fr.comp.lang.c :

Ma question est:
pourquoi au cours d'une et une seule exécution du programme,même
après avoir introduit srand( ),quand on utlilise plusieurs fois rand(
) dans une même fonction(par exemple tirage de plusieurs nombres
aléatoires),ça ne donne pas le même nombre aléatoire?


La norme indique que pour une même graine passée à srand, la suite de
nombre pseudo-aléatoire retournée par rand est identique. Le
comportement que tu décris est non conforme.


Attention, il me semble que la question est pourquoi plusieurs appels
successifs de rand() au sein du même programme lors de la même
exécution ne donne pas le même nombre aléatoire !

C'est tout à fait normal ! srand génère une suite de nombres aléatoires
à l'aide de la graine et la fonction rand() vient ensuite piocher dans
cette suite pour simuler des tirages aléatoires.

Prat pensait que si on faisait :

********************
srand(timer(NULL));
a=rand();
b=rand();
c=rand();
********************

alors on aurait a = b = c !

Cordialement,
--
Jacques VALLOIS
"Notre science est primitive et enfantine, mais c'est notre bien le plus
précieux."
(Albert Einstein)


Antoine Leca
Le #982615
prat wrote:
En C,quand on utilise la fonction rand( ) elle doit être utilisée avec
la fonction srand( ) de manière lors de chaque exécution du programme,
rand( ) ne donne pas le même nombre aléatoire.


En fait, *si* tu veux que la série fournie par les appels successifs à
rand() ne se répète pas, *alors* tu dois utiliser srand(graine) (avec une
graine aléatoire ou pseudo-aléatoire).

Par contre, *si* tu veux avoir de nouveau la même série, il suffit de faire
un nouvel appel à srand() avec la même graine que précédemment ; l'intérêt
ici est la reproductibilité.


Si tu veux un « vrai » générateur de nombres pseudo-aléatoires, il ne faut
pas utiliser rand() et srand(), ce n'est pas fait pour cela.


Ma question est:
pourquoi au cours d'une et une seule exécution du programme,même après
avoir introduit srand( ),quand on utlilise plusieurs fois rand( ) dans
une même fonction(par exemple tirage de plusieurs nombres
aléatoires),ça ne donne pas le même nombre aléatoire?


Cela doit donner la même série, mais les éléments de la série sont
différents (normalement, répartis de manière aléatoire entre 0 et RAND_MAX.)


Antoine

Mihamina (R12y) Rakotomandimby
Le #983111
Antoine Leca wrote:

Si tu veux un « vrai » générateur de nombres pseudo-aléatoires, il ne faut
pas utiliser rand() et srand(), ce n'est pas fait pour cela.


Comme tu n'en a pas dis assez:
Qu'est-ce qui est donc fait pour générer des nombres (pseudo-)aléatoires?
Merci.

Sylvain
Le #983110
Mihamina (R12y) Rakotomandimby wrote on 09/03/2007 22:56:
Antoine Leca wrote:

Si tu veux un « vrai » générateur de nombres pseudo-aléatoires, il ne faut
pas utiliser rand() et srand(), ce n'est pas fait pour cela.


Comme tu n'en a pas dis assez:


plutôt qu'il "l"'a mal dit; un "vrai", un "faux" ne décrive pas grand
chose de factuel (ni formelle)

Qu'est-ce qui est donc fait pour générer des nombres (pseudo-)aléatoires?


pour obtenir des nombres qui satisfont à, par exemple, les critères
d'une spécification telle FIPS 140, on choisi une implémentation
certifiée FIPS 140; pour obtenir des nombres "juste pas toujours pareil"
sans se soucier de la homogénéité (de leur fréquence), ni de leur
prédictibilité, on peut utiliser rand().

Sylvain.


Antoine Leca
Le #982780
Mihamina (R12y) Rakotomandimby wrote:
Antoine Leca wrote:

Si tu veux un « vrai » générateur de nombres pseudo-aléatoires, il
ne faut pas utiliser rand() et srand(), ce n'est pas fait pour cela.


Comme tu n'en a pas dis assez:


Je n'en dis pas assez car le contexte donné par le message original ne donne
pas beaucoup d'informations siur les finalités recherchées. De plus il
semble que ma réponse ait suffit, ne t'en déplaise.


Qu'est-ce qui est donc fait pour générer des nombres
(pseudo-)aléatoires? Merci.


Peux-tu préciser ta question ? en particulier le champ d'application.


Antoine


Publicité
Poster une réponse
Anonyme