Какова область действия случайного семени в Python?

Если я использую функцию Python random.seed(my_seed) в одном классе в моем модуле, останется ли это начальное значение для всех других классов, созданных в этом модуле?


person Lyrositor    schedule 11.09.2012    source источник


Ответы (1)


Да, начальное значение установлено для (скрытого) глобального экземпляра Random() в модуле. Из документации:

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

Используйте отдельные экземпляры Random(), если вам нужно хранить семена отдельно; вы можете передать новое семя при его создании:

>>> from random import Random
>>> myRandom = Random(anewseed)
>>> randomvalue = myRandom.randint(0, 10)

Класс поддерживает тот же интерфейс, что и модуль.

person Martijn Pieters    schedule 11.09.2012
comment
Означает ли это, что eval( "random.random()" ) также будет чтить это семя? - person Dilawar; 30.12.2016
comment
@Dilawar да, eval() здесь не особенный; он по-прежнему использует те же пространства имен, и random просматривается из глобальных переменных, в которых вы запускаете eval(), находя тот же модуль. - person Martijn Pieters; 30.12.2016
comment
Просто для уточнения: объекты, созданные из этого класса, по-прежнему будут давать разные (для каждого объекта) значения для случайных переменных. - person Ataxias; 04.08.2018