2017-09-14 55 views
0

同一个项目有两个不同设置的python运行,但具有相同的随机种子。`numpy.random`状态的差异消失

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

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

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

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

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

我很好奇,如果它是唯一的可能性或有另一种解释。

在此先感谢。

地址:我忘了提及那时没有播种。

+0

没有代码,谁知道?他们显然没有做出相同的确切的呼叫顺序,虽然他们似乎在拨打相同的号码。我的猜测是对散列排序敏感的东西,但我没有任何数据可以使用。 – hobbs

+0

你能提供一个可重现的最小例子吗?如果没有具体的实施细节,会很难给出有意义的建议。 –

+0

感谢您的意见。这实际上是一个巨大的项目,我想排除其他可能性。我在想,如果我可以钩住'numpy.random'相关的调用,调试会更容易。 – noname

回答

0

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

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

所以,如果呼叫到random功能的顺序并不独立运行之间是相同的,那么您可能会再次看到发散的随机数生成的序列中,具有收敛作用,如果梅森难题“阶梯”的行再起。

您可以通过为每个正在使用的函数初始化一个单独的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) 

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

+0

谢谢你的回答。是的,似乎没有其他方法可以解释它。 – noname

+0

@noname是的,我会建议总是初始化你自己的'RandomState'实例。我遇到了使用'import random'的多个导入包的问题,​​然后如果其中一个包(或者你自己的代码)设置了一个种子,那么所有的包最终都会有一个种子随机实例。 –