У меня довольно большая программа, в которой я использую функции из random
модуля в разных файлах. Я хотел бы иметь возможность установить случайное начальное число один раз в одном месте, чтобы программа всегда возвращала одни и те же результаты. Можно ли этого достичь python
?
83
random
кода уровня модуля, который вы импортируете в main, до того, как выrandom.seed(n)
перейдете в main, то эти вызовы будут выполняться перед семенем, поэтому они будут отсортированы по времени и фактически не воспроизводятся случайный.random.Random()
конструктор и использовать их, когда важна строгая воспроизводимость.Комментарий zss должен быть выделен как фактический ответ:
источник
random module
, скажем, функции,random.choices()
а затем в какой-то другой точкеnumpy
генератора случайных чисел, скажем,np.random.normal()
вам нужно установить начальное число для обоих модулей. Что я обычно делаю, так это добавляю пару строк в моиmain.py
лайкиrandom.seed(my_seed)
иnp.random.seed(my_seed)
. Kudos to zssset_random_seed()
для Sage.В начале вызова приложения
random.seed(x)
убедитесь, что x всегда одинаково. Это гарантирует, что последовательность псевдослучайных чисел будет одинаковой при каждом запуске приложения.источник
Джон Клементс в значительной степени отвечает на мой вопрос. Однако это не было реальной проблемой: оказалось, что причиной случайности моего кода был SVD numpy.linalg, потому что он не всегда дает одинаковые результаты для плохо подготовленных матриц !!
Поэтому обязательно проверьте это в своем коде, если у вас такие же проблемы!
источник
Основываясь на предыдущих ответах: имейте в виду, что многие конструкции могут расходиться по пути выполнения, даже если все начальные числа находятся под контролем.
Я думал: « Ну, я установил свои семена так, чтобы они всегда были одинаковыми, и у меня нет изменяющихся / внешних зависимостей, поэтому путь выполнения моего кода всегда должен быть одинаковым », но это было неправильно.
Пример, который меня укусил, был
list(set(...))
, где итоговый порядок может отличаться.источник
Одно важное предостережение заключается в том, что для версий python до 3.7 ключи словаря не являются детерминированными. Это может привести к случайности в программе или даже к иному порядку, в котором генерируются случайные числа и, следовательно, недетерминированным случайным числам. Вывод обновления питона.
источник
Вы можете легко гарантировать это, используя собственный генератор случайных чисел.
Просто выберите три больших простых числа (если это не криптографическое приложение) и вставьте их в a, b и c: a = ((a * b)% c) Это дает систему обратной связи, которая производит довольно случайные данные. Обратите внимание, что не все простые числа работают одинаково хорошо, но если вы просто проводите моделирование, это не имеет значения - все, что вам действительно нужно для большинства симуляций, - это беспорядок чисел с достаточно сложным шаблоном (псевдослучайным, помните), чтобы он каким-то образом не соответствует вашему приложению.
Кнут говорит об этом.
источник