При стремлении к воспроизводимости кода Python с использованием генераторов случайных чисел рекомендуемым методом является создание отдельных объектов RandomState. К сожалению, некоторые существенные пакеты, такие как scipy.stats, не могут (насколько мне известно) быть настроены на использование определенного RandomState и будут просто использовать текущее состояние numpy.random. Мой текущий обходной путь заключается в использовании менеджер контекста, который сохраняет состояние ГСЧ, а затем сбрасывает его при выходе следующим образом:Python: опасность временного изменения случайного семени с помощью диспетчера контекстов?
class FixedSeed:
def __init__(self, seed):
self.seed = seed
self.state = None
def __enter__(self):
self.state = rng.get_state()
np.random.seed(self.seed)
def __exit__(self, exc_type, exc_value, traceback):
np.random.set_state(self.state)
Есть много предупреждений в документации об изменении состояния в любом случае - является ли вышеуказанный подход безопасным в целом? (В том смысле, что изменение является локальным к контексту, а остальная часть моего кода не будет затронута)