【问题标题】:Does a random seed set via numpy.random.seed maintain across submodules?通过 numpy.random.seed 设置的随机种子是否跨子模块维护?
【发布时间】:2019-03-04 23:28:07
【问题描述】:

如果我为我的 RNG 设置种子,例如numpy.random.seed(0)我调用了一个子模块,RNG的状态会保持吗?

例如

# some_lib.py
def do_thing():
  return numpy.random.rand()
# parent module
import some_lib
numpy.seed(0)
...
some_lib.do_thing()

父母设置的numpy状态会被孩子使用吗?

【问题讨论】:

    标签: python numpy random


    【解决方案1】:

    种子是numpy 的所有用途的全局值。因此,只要子模块不为其重新设置种子,或不确定地从中提取值(有效地将其调整为基于推进旧种子的新种子),那么种子将被保留。

    大多数 PRNG 库都以这种方式运行,因为替代方案毫无用处;对于可重现的测试,您希望能够设置一次种子,并让一切都依赖于那个稳定的种子。如果存在每个模块的种子,则测试模块无法为被测试模块使用的 PRNG 提供种子。

    【讨论】:

    • Python 的设计有帮助。导入的模块是单例的,在不同的地方重新导入会返回对同一模块的引用。
    • @MarkRansom:是的。 reload 函数可能会有点混乱,就像手动处理 sys.modules 一样,但这种废话只应该发生在交互式会话中,而不是“真实”代码中。
    【解决方案2】:

    在测试中,numpy 的 RNG 状态似乎是由子进程维护的。

    【讨论】:

      猜你喜欢
      • 2022-07-11
      • 2014-11-21
      • 2011-06-14
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 2021-03-23
      • 2020-03-18
      • 1970-01-01
      相关资源
      最近更新 更多