arc4random Генератор случайных чисел - PullRequest
4 голосов
/ 14 декабря 2010
int randomNumber = (arc4random() % 83) + 1;

Это лучший способ для генерации "самого случайного" числа? Или есть лучший способ сгенерировать случайное число?

Ответы [ 3 ]

13 голосов
/ 14 декабря 2010

Когда вы используете arc4random, вы избегаете одной ловушки использования % с линейными конгруэнтными генераторами (что является обычным алгоритмом, используемым rand): младшие биты не менее случайны.

Однако у вас все еще есть проблемы с усечением: то есть, поскольку (1 << 32) % 83 равно 77, это означает, что числа между 0 и 76 появляются (немного) чаще, чем числа между 77 и 82. Чтобы избежать этого, вы должны выбросить входящиезначение (т. е. снова вызвать arc4random), если оно выше (1 << 32) / 83 * 83.

(я предполагаю, что диапазон arc4random составляет от 0 до 2 32 -1.объяснение соответственно.)

9 голосов
/ 14 декабря 2010

arc4random имеет превосходный алгоритм генерации случайных чисел на основе текущего времени. Существуют и другие функции ранда, но они не так хороши и требуют заполнения.

2 голосов
/ 20 июля 2012

Лучший генератор случайных чисел, который я когда-либо видел (а также очень четкое определение того, что означает случайное число) можно найти в Стивене Вольфраме «Новый вид науки».Он десятилетиями использовал очень простой клеточный автомат в качестве генератора случайных чисел в своей программе Mathematica, поэтому он был чрезвычайно хорошо протестирован.

...