Quelle est la différence entre arc4random et arc4random_uniform?

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

Quelle est la différence entre utiliser arc4random et arc4random_uniform pour générer des nombres aléatoires?

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

De l’ man 3 arc4random :

arc4random_uniform () retournera un nombre aléatoire uniformément dissortingbué 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 l’ arc4random ait une plage 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.