встановити випадкове насіння по всій програмі в python


84

У мене досить велика програма, де я використовую функції randomмодуля в різних файлах. Я хотів би мати можливість встановити випадкове насіння один раз, в одному місці, щоб програма завжди повертала однакові результати. Чи можна цього взагалі досягти python?

Відповіді:


122

Головний модуль python, який запускається, повинен import randomі викликати random.seed(n)- він ділиться між усіма іншими імпортами random, якщо десь ще не скидається насіння.


3
чи міг би я десь скинути насіння, не знаючи цього? оскільки встановлення насіння один раз в основний файл, не робить фокусу
Mischa Obrecht

1
@MischaObrecht Я думаю, що так - насіння ініціалізується лише при першому імпорті випадкового модуля - якщо воно імпортується більше одного разу, воно не буде виконувати ініціалізацію та скидання насіння - тому десь у вашому коді повинен бути явний виклик
Джон Клементс

3
Якщо ви викликаєте методи з randomкоду рівня модуля, який ви імпортуєте в main, перш ніж перейти до random.seed(n)main, тоді ці виклики будуть здійснені перед початковим елементом, і, таким чином, будуть розподілені за часом та ефективно не відтворювані випадкові.
Рассел Борогове

13
Якщо виявиться, що якийсь сторонній код перезавантажує RNG (малоймовірно, але можливо), зверніть увагу, що ви можете створити додаткові генератори випадкових чисел з незалежним станом за допомогою random.Random()конструктора та використовувати такі, коли важлива сувора відтворюваність.
Рассел Борогове

Для мене це не працює. І я не маю відтворюваного коду. Я здогадуюсь, що мені доведеться перевірити документацію всіх імпортованих бібліотек ... (див. Stackoverflow.com/questions/37886997/…
B Furtado

36

Коментар zss слід виділити як фактичну відповідь:

Інша справа, з якою люди повинні бути обережними: якщо ви використовуєте numpy.random, то вам потрібно використовувати numpy.random.seed()для встановлення насіння. Використання random.seed()не встановить насіння для випадкових чисел, що генеруються з numpy.random. Це мене на деякий час збентежило. -zss


Абсолютно вірно, якщо десь у вашому додатку ви використовуєте випадкові числа з random module, скажімо, функція, random.choices()а потім далі в якійсь іншій точці numpyгенератор випадкових чисел, скажімо, np.random.normal()вам потрібно встановити початкове число для обох модулів. Що я зазвичай роблю, це мати кілька рядків у моєму main.pylike random.seed(my_seed)і np.random.seed(my_seed). Престижність ZSs
Aenaon

Sage має подібну проблему, оскільки його PRNG відрізняється як від Python, так і від numpy. Використовуйте set_random_seed()для Шавлії.
Брент

8

На початку дзвінка заявки random.seed(x)переконайтесь, що x завжди однаковий. Це забезпечить послідовність псевдовипадкових чисел однаковою під час кожного запуску програми.


3

Джон Клементс майже відповідає на моє запитання. Однак це була не справжня проблема: виявляється, причиною випадковості мого коду був SVD numpy.linalg, оскільки він не завжди дає однакові результати для погано обумовлених матриць !!

Тож обов’язково перевірте це у своєму коді, якщо у вас такі самі проблеми!


23
Інша справа, з якою люди повинні бути обережними: якщо ви використовуєте numpy.random, то вам потрібно використовувати numpy.random.seed (), щоб встановити насіння. Використання random.seed () не встановить насіння для випадкових чисел, що генеруються з numpy.random. Це мене на деякий час збентежило.
zss

1

Спираючись на попередні відповіді: пам’ятайте, що багато конструкцій можуть розходитись у шляхах виконання, навіть коли всі насіння контролюються.

Я думав, " ну я встановив насіння, щоб вони завжди були однаковими, і я не маю змінних / зовнішніх залежностей, тому шлях виконання мого коду завжди повинен бути однаковим ", але це неправильно.

Прикладом, який мене вкусив, був list(set(...)), де отриманий порядок може відрізнятися.


Хороший момент, це мене спалило раніше. Також такі речі, як отримання результатів з баз даних, вони також повертаються зі строю (випадковим чином), якщо не вказано інше
Джастін Фурунес

0

Одним із важливих застережень є те, що для версій python раніше 3.7 ключі словника не є детермінованими. Це може призвести до випадковості в програмі або навіть до іншого порядку, в якому генеруються випадкові числа, а отже, недетермінованих випадкових чисел. Висновок оновлення python.


-14

Ви можете гарантувати це досить легко, використовуючи власний генератор випадкових чисел.

Просто виберіть три великі прості числа (припускаючи, що це не програма для криптографії) і підключіть їх до a, b та c: a = ((a * b)% c) Це дає систему зворотного зв'язку, яка виробляє досить випадкові дані. Зауважте, що не всі прості числа працюють однаково добре, але якщо ви просто робите симуляцію, це не має значення - все, що вам дійсно потрібно для більшості моделювань, - це перемішування чисел із шаблоном (псевдовипадковим, пам’ятайте) досить складним, щоб це якимось чином не збігається з вашим додатком.

Кнут говорить про це.


10
Прокручувати власне не потрібно, оскільки Python має відмінні можливості випадкових чисел у своїй стандартній бібліотеці, і дуже легко створити справді поганий генератор, якщо ви не знаєте, що робите.
Рассел Борогове

6
Я згоден, що це досить погане рішення: в моделюванні Монте-Карло (що є моєю програмою), де зазвичай збирають мільйони вибірок, корельовані випадкові числа (що походять від поганого генератора) можуть легко зіпсувати ваші результати !!
Mischa Obrecht

Ви маєте на увазі, що Кнут постійно про це говорить? Навіть зараз?
значення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.