【问题标题】:Discrepancy of the state of `numpy.random` disappears`numpy.random` 状态的差异消失了
【发布时间】:2018-02-22 21:17:25
【问题描述】:

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

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

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

并且在该点产生了一次不同的结果之后,它们在一段时间内再次产生相同的序列。

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

在某处使用numpy.random 的东西引起了差异并再次修复它只是巧合吗?

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

提前致谢。

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

【问题讨论】:

  • 没有代码,谁知道呢?他们显然没有进行完全相同的调用顺序,尽管他们似乎进行了相同的 number 次调用。我的猜测是对哈希排序敏感,但我没有数据可以使用。
  • 你能提供一个可重现的、最小的例子吗?如果没有具体的实施细节,很难给出有意义的建议。
  • 感谢您的 cmets。这实际上是一个巨大的项目,我想排除其他可能性。我在想,如果我可以挂钩 numpy.random 相关的调用,调试起来会更容易。
  • 每次单独运行是否使用相同数量的 any random 函数调用?或者您是否有一些其他随机数正在生成取决于该运行的设置?
  • @AndrewGuy 他们最终使用不同数量的调用(不是一开始)。我想我不能用另一种方式来解释它。 :)

标签: python numpy-random


【解决方案1】:

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

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

因此,如果 每个 调用 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)

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

【讨论】:

  • 感谢您的回答。是的,似乎没有其他方法可以解释它。
  • @noname 是的,我建议始终初始化您自己的 RandomState 实例。我遇到了使用import random 导入的多个包的问题,​​然后如果其中一个包(或您自己的代码)设置了种子,那么 all 这些包最终会得到一个种子随机实例.
猜你喜欢
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多