В чем разница между arc4random и arc4random_uniform?

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

Другие вопросы по тегам