python 3: random.seed (): где это назвать? - PullRequest
7 голосов
/ 03 февраля 2011

Мне нужно убедиться, что все случайности в моей программе полностью воспроизводимы. Где я должен сделать звонок в random.seed ()?

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

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

Есть ли простое и безопасное решение?

Ответы [ 3 ]

7 голосов
/ 03 февраля 2011

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

import random
random.seed(seed_value)

import something
import else

if __name__ == "__main__":
    main()
4 голосов
/ 04 февраля 2011

Если вы хотите, чтобы случайные значения были реплицируемыми, то, вероятно, лучше создать экземпляр random.Random в вашем приложении, вызвать seed() для этого экземпляра и использовать этот экземпляр для случайных чисел. 1005 *

random.random() на самом деле использует синглтон класса random.Random, для удобства людей, которым все равно, чтобы создать собственный экземпляр класса. Но этот синглтон потенциально используется совместно с другими модулями, которые могут захотеть вызвать random.random() для генерации случайных чисел по любой причине. Вот почему в вашем случае вам лучше создать собственный экземпляр random.Random.

Цитирование из документов :

Функции, предоставляемые этим модулем, на самом деле являются связанными методами скрытого экземпляра класса random.Random. Вы можете создать свои собственные экземпляры Random, чтобы получить генераторы, которые не делят состояние.

1 голос
/ 03 февраля 2011

Вы можете бросить свой собственный синглтон, который инкапсулирует случайный.Затем вы можете использовать документацию Python на случайных getstate и setstate для изменения состояния генератора случайных чисел.Это дало бы вашей программе два генератора случайных чисел.

...