J’utilise ce code depuis presque dix heures sans amour:
while ( true ) { int r = rand(); assert( r != 0 ); }
Je m’attends à ce que rand () lance un zéro et déclenche l’assertion.
Est-ce que je fais quelque chose de mal ou rand () ne renvoie-t-il jamais zéro?
Ou n’ai-je pas attendu assez longtemps pour espérer le voir? Je suis sur 2012-vintage 2GHz i7.
Si ce lien correspond à la définition de Mac OS X rand()
, 0 ne sera jamais produit. Ce n’est pas un très bon générateur de nombres pseudo aléatoires, à mon humble avis.
Parmi ses autres défauts, son état est la valeur précédemment renvoyée, ce qui signifie qu’il s’agit d’une fonction ssortingcte allant de la valeur précédente à la valeur suivante; son cycle ne peut pas être supérieur à sa plage, qui est [1, RAND_MAX-1]
. (Il ne peut pas produire 0 car 0 est un point fixe dans l’algorithme.)
La norme exige que les appels successifs à rand
forment une séquence qui est un sous-ensemble de l’espace [0; RAND_MAX]
[0; RAND_MAX]
. Il n’est pas nécessaire que toutes les valeurs possibles apparaissent dans l’une des séquences possibles.
Donc, pour répondre à votre question: vous n’êtes pas assuré d’obtenir un zéro; C’est à l’implémentation (et à en juger par les réponses, l’implémentation de BSD libc ne renvoie en effet jamais 0
).
§ 7.22.2.2
Il n’y a aucune garantie quant à la qualité de la séquence aléatoire produite et certaines mises en œuvre sont connues pour produire des séquences avec des bits de poids faible de poids faible non aléatoires.
Edit: ce que @rici a dit.
On dirait que le rand FreeBSD ne revient jamais 0
Cette chaîne de messages contient un correctif, mais il n’est pas inclus dans le code source ouvert Apple.
Il devrait éventuellement renvoyer zéro, mais sur mon ordinateur, RAND_MAX
est 2147483647.
printf("rand_max = %d\r\n", RAND_MAX);
Wolfram alpha ne peut pas calculer cette probabilité infime.
Exécuter ces exemples:
prob x>0 for x binomial with n=100000 and p=.00001
prob x>0 for x binomial with n=10000 and p=.0001
prob x>0 for x binomial with n=1000 and p=.001
Montrer qu’après pour une probabilité de 1 / N, N tentatives semblent approcher environ 0.63
Il semble que 5 * N tentatives devraient vous amener plus de 99% cependant.
Je ne sais pas combien de temps votre ordinateur mettra 10 milliards d’appels au rand.