#python #python-3.x #random #random-seed
#python #python-3.x
Вопрос:
random.seed(a = None, version = 2) Инициализирует генератор случайных чисел.
Если a опущено или отсутствует, используется текущее системное время. Если источники случайности предоставляются операционной системой, они используются вместо системного времени (см. Функцию os.urandom() для получения подробной информации о доступности).
Но … если это действительно случайно … (и я думал, что читал, что он использует Мерсенна, так что он ОЧЕНЬ случайный)…какой смысл в его заполнении? В любом случае результат непредсказуем … верно?
Ответ №1:
Значение по умолчанию, вероятно, лучше всего, если вы хотите разные случайные числа при каждом запуске. Если по какой-то причине вам нужны повторяющиеся случайные числа, например, при тестировании, используйте начальное значение.
Ответ №2:
Модуль фактически заполняет генератор (с предоставленными ОС случайными данными, urandom
если это возможно, в противном случае с текущей датой и временем) при импорте модуля, поэтому нет необходимости вызывать вручную seed()
.
(Это упоминается в документации Python 2.7, но, по какой-то причине, не в документации 3.x. Тем не менее, я подтвердил в источнике 3.x, что это все еще сделано.)
Если бы автоматическое заполнение не было выполнено, вы бы получали одну и ту же последовательность чисел каждый раз, когда запускали свою программу, так же, как если бы вы каждый раз вручную использовали одно и то же начальное значение.
Ответ №3:
Но … если это действительно случайное
Нет, это псевдослучайно. Если он использует Mersenne Twister, это тоже PRNG.
По сути, это алгоритм, который генерирует точно такую же последовательность псевдослучайных чисел из заданного начального числа. Генерация действительно случайных чисел требует специальной аппаратной поддержки, это не то, что вы можете сделать с помощью чистого алгоритма.
Возможно, вам не нужно заполнять его, поскольку он заполняется сам при первом использовании, если только у вас нет других или лучших средств предоставления начального числа, чем то, что основано на времени.
Если вы используете случайные числа для вещей, которые не связаны с безопасностью, начальное значение, основанное на времени, обычно подходит. Если вы используете if для безопасности / криптографии, обратите внимание, что говорится в документах: «и совершенно не подходит для криптографических целей»
Комментарии:
1. О, ну да, я знаю, что это псевдослучайно. Но я не подумал об этом, что вы, возможно, захотите повторить заданную последовательность.
2. @Aerovistae: это в основном определение псевдослучайности 😉
Ответ №4:
Если вы хотите воспроизвести свои результаты, вы заполняете генератор известным значением, чтобы каждый раз получать одну и ту же последовательность.
Ответ №5:
Mersenne twister, генератор случайных чисел, используемый Python, заполняется операционной системой, которая по умолчанию обслуживает случайные числа на тех платформах, где это возможно (Unixen, Windows); однако на других платформах начальным значением по умолчанию является системное время, что означает очень повторяющиеся значения, если системное время имеет плохую точность. Таким образом, в таких системах полезно заполнять с известными лучшими случайными значениями. Обратите внимание, что, в частности, на Python 3, если используется версия 2, вы можете передать любой str
, bytes
, или bytearray
для заполнения генератора; таким образом, лучше использовать большое состояние Mersenne twister.
Еще одна причина использовать начальное значение — действительно гарантировать, что вы снова и снова получаете одну и ту же последовательность случайных чисел — путем повторного использования известного начального числа. Цитирование документов:
Иногда полезно иметь возможность воспроизводить последовательности, заданные генератором псевдослучайных чисел. При повторном использовании начального значения одна и та же последовательность должна воспроизводиться от запуска к запуску, пока не запущено несколько потоков.
Большинство алгоритмов и функций заполнения модуля random могут быть изменены в разных версиях Python, но два аспекта гарантированно не изменятся:
- Если добавлен новый метод заполнения, будет предложена обратно совместимая сеялка.
- Метод random() генератора продолжит выдавать ту же последовательность, когда совместимому сеялке будет присвоено то же начальное значение.
Однако для этого вы в основном хотите использовать random.Random
экземпляры вместо использования глобальных методов модуля (проблема с несколькими потоками и т. Д.).
Наконец, также обратите внимание, что случайные числа, создаваемые Mersenne twister, непригодны для криптографического использования; хотя они кажутся очень случайными, можно полностью восстановить внутреннее состояние генератора случайных чисел, наблюдая только несколько сотен значений из генератора. Для криптографических алгоритмов вы хотите использовать SystemRandom
класс.
Ответ №6:
В большинстве случаев я бы сказал, что нет необходимости беспокоиться. Но если кто-то действительно хочет сделать что-то связанное и (и) он мог бы примерно определить ваше системное время, когда ваш код выполнялся, они могли бы перебором воспроизвести ваши случайные числа и посмотреть, какая серия подходит. Но я бы сказал, что в большинстве случаев это маловероятно.