2010-12-14 2 views
4
int randomNumber = (arc4random() % 83) + 1; 

Это лучший способ генерировать «самый случайный» номер? Или есть лучший способ генерировать случайное число?arc4random Генератор случайных чисел

+0

Вы можете задать этот вопрос: http://stackoverflow.com/questions/3724526/how-to-generate-random-number-from-0-5-to-1-0/3724668#3724668 –

ответ

9

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

+3

'arc4random' также требует посева, он просто сажает себя перед первым использованием. – Joey

+1

превосходный что? –

+0

Rand и аналогичные функции, которые не производят столь же широкий диапазон, как arc4random – prgmast3r

13

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

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

(я предполагаю, что диапазон arc4random от 0 до 2 -1. Отрегулировать выше объяснения соответствующим образом.)

+1

@ Joe Blow: OP запросил «лучшую» систему генерации случайных чисел, обычно доступную, поэтому я отвечал на это. Кроме того, 'arc4random' является удивительным: он использует энтропию, собранную ядром, и все эти хорошие вещи. –

+1

@ Joe Blow: На самом деле, 'arc4random' - это криптоклассная случайность. Это эквивалентно чтению из '/ dev/arandom'. Таким образом, вы можете использовать его для криптографического материала, если вы правильно обрабатываете случайность (и невольно не искажаете результаты, не делая проверку, о которой я упоминал). –

+0

В настоящее время существует ряд хорошо известных смещений в arc4. Например, http://www.worldlingo.com/ma/enwiki/ru/RC4 «Ключевой поток, генерируемый RC4, в той или иной степени смещен в сторону определенных последовательностей». Вот почему вы не можете использовать arc4 для, например, научно-важных симуляторов MC. – Fattie

2

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

Смежные вопросы