Насколько случайна функция rand()?

#random

#Случайный

Вопрос:

Более конкретно, мой вопрос заключается в том, что при бесконечном времени int(rand()*1000) в конечном итоге попадет каждое число от 0 до 999? Как насчет 10 ^ 4, 10 ^ 5… Я предполагаю, что она гарантированно сломается, как только вы нажмете размер в памяти, т. Е. Если rand () возвращает значение с плавающей точкой, которое, скажем, составляет n бит в памяти, вы не сможете набрать более n разных целых чисел, поэтому, как только вы доберетесь до rand()*(2^n 1) , вы гарантированно пропустите некоторые.

Комментарии:

1. Не существует уникальной rand( ) функции; она может варьироваться от языка к языку, а для некоторых языков — от реализации к реализации. Пожалуйста, будьте более точны в отношении того, о каком языке и платформе вы спрашиваете.

2. Можете ли вы указать, о каком rand() средстве вы говорите? Язык, библиотека и т.д… В целом вы правы в том, что количество возможных выходов не может быть больше количества возможных входов.

3. Большинство языков используют LCG для своего стандартного rand() из-за его легковесности, хотя некоторые имеют больше опций.

Ответ №1:

Да, за бесконечное время она поразит каждое число в вашем диапазоне при условии, что оно имеет бесконечный период; как только начальное значение будет достигнуто снова, последовательность повторяется. Конечно, как вы упомянули, вы были бы ограничены точностью значения, возвращаемого rand (), и в конечном итоге вы достигли бы критической точки, когда оно не могло бы отображаться на каждое целое число в достаточно большом диапазоне. Но если вы рассматриваете теоретический компьютер с бесконечной точностью и периодом (вы упомянули бесконечность), то вы будете набирать каждое число в указанном вами диапазоне за бесконечное время.

Однако rand () использует LCG, который не дает вам равномерного распределения чисел. То есть вы получите попадание некоторого числа с более высокой частотой, чем другие (хотя с бесконечным временем вы бы попали во все, поскольку бесконечность — это просто круто). Если вам требуется равномерное распределение, то используйте что-то вроде алгоритма Mersenne Twister. В библиотеках Boost есть генератор случайных чисел, который имеет функцию Mersenne Twister и прост в реализации.

Комментарии:

1. Это может быть LCG не на каждом языке, но LCG очень распространен.

2. @Zach, я хочу сказать, что вопрос не содержит достаточных подробностей для ответа. Пример: в настоящее время Python использует Mersenne Twister, а не линейный конгруэнтный генератор. И сколько именно возможных результатов этого rand() вызова существует? Это единица, удвоение, дробь? Не зная этих деталей, вы просто строите предположения.

3. Вопрос о генераторах случайных чисел носит скорее теоретический характер, иначе бесконечное время не упоминалось бы, и вы можете обобщить свой ответ, чтобы учесть различные генераторы, приводящие примеры более распространенных, таких как LCG и MT. Кроме того, вы также можете обрабатывать точность обобщенным образом, поскольку эти алгоритмы обобщены для точности (в конечном итоге регистры будут иметь большие размеры, чем в настоящее время). В зависимости от того, является ли производительность или качество случайности более высоким приоритетом, вы хотели бы выбрать алгоритм соответствующим образом, и есть также больше вариантов, чем LCG и MT.

4. Кроме того, любой может легко создать генератор низкого качества, такой как в том мультфильме. Также существует бесконечное количество этих алгоритмов…