Est-ce que rand () renvoie jamais zéro sur OSX?

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.