C: la vérité définitive sur rand, random et arc4random

Il y a beaucoup d’informations contradictoires sur ce sujet. Essayons donc de nous mettre d’accord sur une réponse définitive:

Lequel de ces générateurs de nombres aléatoires en C crée un meilleur caractère aléatoire: rand, random ou arc4random?

Remarque: pour que la question soit claire, il ne s’agit pas d’une question de véritable caractère aléatoire, c’est seulement un conflit entre ces 3.


Comme indiqué, cette question n’a pas beaucoup de sens, car il ne s’agit pas de C, mais d’une implémentation spécifique, dans mon cas, le cacao (plus précisément l’iPhone sdk, mais je suppose qu’ils sont les mêmes pour autant les fonctions vont). Pourtant, il y a quelques informations utiles ici. J’ai conclu en mettant en œuvre arc4random, principalement en raison de sa facilité d’utilisation (aucun ensemencement nécessaire), ce qui est un facteur important que personne n’a signalé.

Je termine la question en ajoutant l’étiquette cacao pour les développeurs de cacao à la recherche d’informations sur les GNR. Merci beaucoup pour ceux qui ont consortingbué et désolé pour la confusion.

Parmi ces fonctions, seul rand fait partie de la norme C. random fait partie de POSIX et arc4random n’est fourni que dans BSD (et ses dérivés). Donc, seul rand est “en C”.

Pour rand, la norme C ne dit rien sur la qualité du générateur, c’est-à-dire que retourner toujours le même nombre serait conforme. Il dit que le nombre doit être compris entre 0 et RAND_MAX. La valeur de RAND_MAX et l’algorithme précis utilisé sont définis par l’implémentation (bien que RAND_MAX soit au moins 32767).

Pour random, POSIX spécifie qu’il doit avoir une période d’au moins 2 ^ 31 par défaut, et si initstate est appelé avec 256 octets d’état, il doit alors avoir une période d’au moins 2 ^ 69; d’autres détails sont à nouveau définis par l’implémentation.

Pour arc4random, la mise en œuvre spécifique fait partie de sa définition (RC4). Il est spécifié que cela donne 2 ^ 32 valeurs différentes; Je n’ai rien trouvé sur sa période.

Pour les comparer en détail, il faut savoir à quelle implémentation vous faites référence.

L’implémentation de rand () n’est pas spécifiée par la norme C. Cependant, la plupart des compilateurs utilisent un générateur de congruence linéaire. random () et arc4random () ne sont pas non plus standards, mais ils sont meilleurs que l’implémentation habituelle de rand ()

Je dirais: arc4random () est meilleur que random () est meilleur que rand ()

rand () est vraiment terrible. Cependant, vous pourriez facilement faire mieux que les trois.

Cela dépend également de ce que vous voulez les nombres aléatoires. Un bon générateur de nombres aléatoires pour le chiffrement / la sécurité peut ne pas être un bon générateur de nombres aléatoires pour la simulation et inversement.