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