#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. Кроме того, любой может легко создать генератор низкого качества, такой как в том мультфильме. Также существует бесконечное количество этих алгоритмов…