多个Numpy进口的全球种子

时间:2015-05-28 21:36:45

标签: python numpy random

假设我有一个Python项目结构:

  导入main.py

random_initialization.py      导入main.py

sample_around_solution.py

random_initializationsample_around_solution.py导入numpy

现在, random_initialization启动问题的随机实例,main运行算法,sample_around_solution使用解决方案周围的随机样本来计算某个指标(例如,解决方案的质量)。

我希望在两个导入的文件中都有numpy.random.seed(0)的运行的可复制性。这是正确的方法吗?我觉得可能有一些边缘情况,这是一个可怕的想法。

2 个答案:

答案 0 :(得分:1)

我认为除了最顶层的模块(通常是

)之外,永远不要操纵随机种子是一个好主意。
  • 只有main.py的短import,有一些程序选项和配置,并调用其他内容)

  • unittest

播种的单点允许做一些有用的事情,例如,

  • 您可以控制将种子设置为可重复性(在您编写时)。

  • 您可以控制更改种子以获得更好的覆盖率(例如,如果您将通过单元测试运行子模块)。

  • 您可以将种子存储在持久存储中,这样如果某些执行出现问题,您可以重现它。

相反,如果子模块自己进行播种,则无法进行播种。我也认为这是错误的封装:而不是一个模块,它做了一些明确定义的功能X,它做X +播种。

顺便说一句,几年前我写了一篇tiny library on PyPI - UnittestRandGenState来做" smart" unittest的种子,然后给了它一些思考。它基本上依赖于你没有提出的建议。

答案 1 :(得分:0)

我更喜欢模拟的每个组件都使用自己的随机数生成器。如果每个蒙特卡罗组件都有自己的模块,并且您想要模块的全局rng状态,那么您可以在模块中放置一个初始化函数:

def init_rng(seed):
    global rng
    rng = numpy.random.RandomState(seed=seed)

然后,您可以单独设置和控制每个过程,即

import componentA
import componentB
import componentC

componentA.init_rng(0)
componentB.init_rng(1)
componentC.init_rng(2)

如果你不喜欢全局变量,你也可以将你的随机过程封装在具有rng属性和初始化函数的类中。

如果所有进程共享同一个生成器,那么processA的结果可能取决于进程B生成的数字等等...