Какая разница между arc4random и arc4random_uniform?

Я видел старые посты о различиях между random и arc4random в Objective-C, и я видел ответы на этот вопрос в Интернете, но на самом деле я не понимал, поэтому я надеялся, что кто-то здесь сможет объяснить это в более простой для понимания форме. понять манеру.

В чем разница между использованием arc4random и arc4random_uniform для генерации случайных чисел?

Ответ 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 три раза каждый, что делает вероятность более вероятной. Это различие становится менее значительным, когда диапазон намного больше, но все же лучше избегать использования модуля.