La séquence de nombres aléatoires générée par rand, en C, est-elle toujours la même, pour la même graine? [dupliquer]
Cette question a déjà une réponse ici:
Je me demandais juste si l'rand
(http://www.cplusplus.com/reference/cstdlib/rand/) va générer la même séquence de nombres aléatoires, en utilisant le même de semences, sur différente libc
implémentations, et même différents compilateurs et systèmes d'exploitation (win, linux).
J'ai fait quelques tests en utilisant divers compilateurs (g++4.8, g++5.1 et clang) et il semble que la réponse est oui, mais je n'ai trouvé aucune mention "officielle" de L'algorithme PRNG utilisé dans la génération de nombres aléatoires du C ( http://pubs.opengroup.org/onlinepubs/009604599/functions/rand.html), ou si ceux-ci devraient être mentionnés dans les normes ...
3 réponses
Il N'y a aucune garantie dans la norme sur ce qui sera généré:
De la norme:
Il N'y a aucune garantie quant à la qualité de la séquence aléatoire et certaines implémentations sont connues pour produire des séquences avec des bits de faible ordre non aléatoires. Applications avec notamment les exigences devraient utiliser un générateur qui est connu pour être suffisant pour leur besoin.
Même RAND_MAX
n'est pas spécifié pour avoir une valeur donnée dans les implémentations C autre qu'elle doit être > = 32767. Ainsi, rand()
sur une implémentation peut renvoyer une plage de valeurs différente de celle d'une autre et donc une séquence différente.
La fonction
rand
calcule une séquence d'entiers pseudo-aléatoires dans plage 0 àRAND_MAX
. C11dr §7.22.2.1 2La valeur de la macro
RAND_MAX
doit être d'au moins 32767. C11dr §7.22.2.1 5
RAND_MAX
qui se développe à un expression constante entière qui est la valeur maximale renvoyée par la fonction Rand §7.22 3
Même avec le même RAND_MAX
, notez @ servi Laurijssen réponse: la séquence de valeurs de rand()
peut différer.
Remarque: par implication, RAND_MAX <= INT_MAX
.
Selon https://stackoverflow.com/a/15500754/1994390 la réponse est non. Il n'y a aucune garantie à travers différentes implémentations.