同一个项目有两个python运行,具有不同的设置,但具有相同的随机种子。
该项目包含一个使用numpy.random.uniform
返回几个随机数的函数。
无论python进程中numpy.random
的其他用途如何,两次运行中的一系列函数调用都生成相同的序列,直到某些点为止。
在此时产生一次不同的结果后,它们会在一段时间内再次生成相同的序列。
我还没有尝试使用numpy.random.RandomState
,但这怎么可能?
使用numpy.random
的某些地方是否导致了这种差异并再次修复它,这只是巧合吗?
我很好奇这是唯一的可能性还是有另一种解释。
提前致谢。
ADD:我忘了提到当时没有播种。
答案 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)
您可能希望为每个实例设置不同的种子 - 这取决于您使用这些伪随机数的内容。