“numpy.random”状态的差异消失了

时间:2017-09-14 02:55:18

标签: python numpy-random

同一个项目有两个python运行,具有不同的设置,但具有相同的随机种子。

该项目包含一个使用numpy.random.uniform返回几个随机数的函数。

无论python进程中numpy.random的其他用途如何,两次运行中的一系列函数调用都生成相同的序列,直到某些点为止。

在此时产生一次不同的结果后,它们会在一段时间内再次生成相同的序列。

我还没有尝试使用numpy.random.RandomState,但这怎么可能?

使用numpy.random的某些地方是否导致了这种差异并再次修复它,这只是巧合吗?

我很好奇这是唯一的可能性还是有另一种解释。

提前致谢。

ADD:我忘了提到当时没有播种。

1 个答案:

答案 0 :(得分:0)

当您在numpy中使用random模块时,每个随机生成的数字(无论分布/功能如何)都使用相同的“全局”RandomState实例。使用numpy.random.seed()设置种子时,可以设置RandomState的“全局”实例的种子。这与Python中的random库的原理相同。

我不确定numpy随机函数的具体实现,但我怀疑每个随机函数都会使底层的Mersenne Twister前进一些“步骤”,步数不一定相同不同的random函数。

因此,如果每个调用random函数的顺序在不同的运行之间不相同,那么您可能会看到生成的随机数序列的差异,再次收敛如果Mersenne Twister'步骤'再次排队。

你可以通过为你正在使用的每个函数初始化一个单独的RandomState实例来解决这个问题。例如:

import numpy as np

seed = 12345
r_uniform = np.random.RandomState(seed)
r_randint = np.random.RandomState(seed)

a_random_uniform_number = r_uniform.uniform()
a_random_int = r_randint.randint(10)

您可能希望为每个实例设置不同的种子 - 这取决于您使用这些伪随机数的内容。