`numpy.random` 状态的差异消失了

Discrepancy of the state of `numpy.random` disappears

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

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

不管 numpy.random 在 python 过程中的其他用途,两次运行中的一系列函数调用都会生成相同的序列,直到某个点。

并且在那个时候产生了一次不同的结果之后,他们在一段时间内再次产生了相同的序列。

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

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

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

提前致谢。

添加:我忘了说当时没有播种。

当您在 numpy 中使用 random 模块时,每个随机生成的数字(不管 distribution/function)都使用 RandomState 的相同 "global" 实例。当您使用 numpy.random.seed() 设置种子时,您设置了 RandomState 的 'global' 实例的种子。这与Python.

中的random库原理相同

我不清楚numpy随机函数的具体实现,但我怀疑每个随机函数都会让底层的Mersenne Twister前进'steps'个数,步数不一定在不同的 random 函数之间是相同的。

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

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

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