Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

rand( ) et srand( )

6 réponses
Avatar
prat
Bonjour,

En C,quand on utilise la fonction rand( ) elle doit =EAtre utilis=E9e avec
la fonction srand( ) de mani=E8re lors de chaque ex=E9cution du programme,
rand( ) ne donne pas le m=EAme nombre al=E9atoire.
Ma question est:
pourquoi au cours d'une et une seule ex=E9cution du programme,m=EAme apr=E8s
avoir introduit srand( ),quand on utlilise plusieurs fois rand( ) dans
une m=EAme fonction(par exemple tirage de plusieurs nombres
al=E9atoires),=E7a ne donne pas le m=EAme nombre al=E9atoire?

merci.

6 réponses

Avatar
Eric Levenez
Le 27/02/07 16:54, dans
, « prat »
a écrit :

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 -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
Jacques VALLOIS
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)


Avatar
Antoine Leca
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

Avatar
Mihamina (R12y) Rakotomandimby
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.

Avatar
Sylvain
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.


Avatar
Antoine Leca
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