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

26
demandé sur someonewithpc 2016-05-23 14:41:43

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.

Http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

35
répondu Serve Laurijssen 2016-05-23 13:53:13

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 2

La 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.

23
répondu chux 2017-05-23 12:01:52

Selon https://stackoverflow.com/a/15500754/1994390 la réponse est non. Il n'y a aucune garantie à travers différentes implémentations.

1
répondu yaakov 2017-05-23 12:33:53