Ответ 1
arc4random
возвращает целое число от 0 до (2 ^ 32) -1, а arc4random_uniform
возвращает целое число от 0 до верхней границы, которую вы передаете.
От man 3 arc4random
:
arc4random_uniform() возвращает равномерно распределенное случайное число меньше, чем upper_bound. arc4random_uniform() рекомендуется использовать для таких конструкций, как `` arc4random()% upper_bound '', поскольку он избегает "модульного смещения", когда верхняя граница не является степенью двух.
Например, если вам нужно целое число от 0 до 4, вы можете использовать
arc4random() % 5
или
arc4random_uniform(5)
Использование оператора модуля в этом случае вводит модульное смещение, поэтому лучше использовать arc4random_uniform.
Чтобы понять погрешность по модулю, предположим, что arc4random
имел гораздо меньший диапазон. Вместо 0 до (2 ^ 32) -1 это было от 0 до (2 ^ 4) -1. Если вы выполняете% 5 на каждом номере в этом диапазоне, вы получите 0 четыре раза, а 1, 2, 3 и 4 три раза каждый, что делает вероятность более вероятной. Это различие становится менее значительным, когда диапазон намного больше, но все же лучше избегать использования модуля.