web-dev-qa-db-fra.com

Quelle est la différence entre arc4random et arc4random_uniform?

J'ai vu d'anciens articles sur les différences entre random et arc4random dans Objective-C, et j’ai vu les réponses à ces questions en ligne, mais je ne comprenais pas vraiment, j’espérais donc que quelqu'un ici pourrait expliquer cela plus facilement.

Quelle est la difference entre using arc4random et arc4random_uniform générer des nombres aléatoires?

42
Brennan Adler

arc4random renvoie un entier compris entre 0 et (2 ^ 32) -1 tandis que arc4random_uniform renvoie un entier compris entre 0 et la limite supérieure que vous lui transmettez.

De man 3 arc4random:

arc4random_uniform () retournera un nombre aléatoire uniformément distribué inférieur à upper_bound. arc4random_uniform () est recommandé par rapport à des constructions telles que "arc4random ()% upper_bound", car il évite le "biais modulo" lorsque la limite supérieure n'est pas une puissance de deux.

Par exemple, si vous voulez un entier compris entre 0 et 4, vous pouvez utiliser

arc4random() % 5

ou

arc4random_uniform(5)

L'utilisation de l'opérateur de module dans ce cas introduit le biais modulo, il est donc préférable d'utiliser arc4random_uniform.

Pour comprendre le biais modulo, supposons que arc4random avait une gamme beaucoup plus petite. Au lieu de 0 à (2 ^ 32) -1, il était 0 à (2 ^ 4) -1. Si vous effectuez 5% sur chaque nombre compris dans cette plage, vous obtiendrez 0 quatre fois et 1, 2, 3 et 4 trois fois, ce qui rendra 0 plus probable. Cette différence devient moins significative lorsque la plage est beaucoup plus grande, mais il vaut mieux éviter d'utiliser le module.

89
Connor