Что (еще) не так с использованием времени в качестве начального числа для генерации случайных чисел? - PullRequest
7 голосов
/ 12 июля 2011

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

Но скажи, что меня не волнует безопасность. Например, скажем, я делаю симуляцию Монте-Карло для карточной игры. Я, однако, забочусь о том, чтобы приблизиться к истинной случайности насколько возможно. Повлияет ли время как семя на случайность моего вывода? Я думаю, что выбор PRNG в этом случае важнее, чем зерно.

Ответы [ 4 ]

5 голосов
/ 12 июля 2011

В целях безопасности вам, очевидно, нужен высокий уровень энтропии.И только время не может это обеспечить.

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

Одна распространенная ловушка, использующая время для посеваPRNG в том, что время не меняется очень часто.Например, в Windows большинство функций, связанных со временем, меняют свое возвращаемое значение только каждые несколько миллисекунд.Таким образом, все PRNG, созданные в этом интервале, будут возвращать одинаковую последовательность.

4 голосов
/ 16 июля 2011

Просто для полноты эта статья Мацумото и соавт.наглядно показывает, насколько важна схема инициализации (т. е. способ выбора начальных значений) для моделирования.Оказывается, плохая схема инициализации может сильно повлиять на результаты, даже если алгоритм ГСЧ как таковой в принципе довольно хорош.

2 голосов
/ 12 июля 2011

Если вы просто запускаете один экземпляр вашей программы, то проблем не должно быть слишком много.

Однако я видел людей, которые запускают несколько программ одновременно, а затем каждая программа начинается со временем. В этом случае все программы получают одинаковую последовательность случайных чисел. В частности, я видел людей, запускающих процесс apache при каждом вызове, чтобы использовать случайный номер в качестве идентификатора сеанса, только чтобы обнаружить, что разные люди, одновременно обращающиеся к веб-серверу, получают одинаковые идентификаторы.

Следовательно, если вы ожидаете запустить несколько одновременных версий программы, тогда использование времени - очень плохая идея.

1 голос
/ 13 июля 2011

Подумайте, что ваша программа работает очень быстро и запрашивает время системы для использования в качестве начального числа в большой последовательности с очень небольшим интервалом.Вы можете получить то же время, что и ответ, так что в итоге вы получите одно и то же случайное число.Таким образом, даже в симуляции низкая энтропия может быть проблемой.

Учитывая, что в вашей системе нет других источников энтропии, то есть даже ваша операционная система может предоставить вам почти- случайные числа, вы можете использовать их для увеличения энтропии вашего времени-семени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...