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