在python中设置随机种子程序

Mis*_*cht 68 python random seed

我有一个相当大的程序,我random在不同的文件中使用模块中的函数.我希望能够在一个地方设置一次随机种子,使程序始终返回相同的结果.甚至可以实现python吗?

Jon*_*nts 99

运行的主要python模块应该import random并且调用random.seed(n)- random只要其他地方没有重置种子,这将在所有其他导入之间共享.

  • 如果事实证明某些第三方代码正在重新接种RNG(不太可能但可能),请注意您可以通过`random.Random()`构造函数创建具有独立状态的其他随机数生成器,并在严格再现性时使用它们.重要. (11认同)
  • 我可以在不知情的情况下在某处重置种子吗?因为在主文件中设置一次种子,不会做到这一点 (3认同)
  • @MischaObrecht我猜是这样的 - 种子仅在随机模块的**第一次**导入时初始化 - 如果导入多次,它不会执行初始化并重置种子 - 所以必须有一个显式调用在你的代码中的某个地方 (2认同)
  • 如果要从模块级代码中的`random`调用方法,即要在main中导入,则在进入main中的`random.seed(n)`之前,这些调用将在种子之前进行,并且因此将是播种时间,并且实际上是不可复制的随机数。 (2认同)

Sid*_*hou 26

zss的评论应该突出显示为一个实际答案:

人们要注意的另一件事是:如果你正在使用numpy.random,那么你需要使用numpy.random.seed()来设置种子.使用random.seed()不会为numpy.random生成的随机数设置种子.这困惑了我一段时间.-zss


Chi*_*era 8

在应用程序调用random.seed(x)开始时确保x始终相同.这将确保在每次运行应用程序期间伪随机数序列将是相同的.


Mis*_*cht 7

乔恩·克莱门茨几乎回答了我的问题。然而这不是真正的问题:事实证明,我的代码随机性的原因是 numpy.linalg SVD,因为它并不总是为条件不良的矩阵产生相同的结果!

因此,如果您遇到同样的问题,请务必检查您的代码中的情况!

  • 人们需要注意的另一件事是:如果您使用 numpy.random,那么您需要使用 numpy.random.seed() 来设置种子。使用 random.seed() 不会为 numpy.random 生成的随机数设置种子。这让我困惑了一段时间。 (33认同)

JBS*_*rro 5

基于之前的答案:请注意,即使所有种子都受到控制,许多结构也可能会分散执行路径。

我在想“好吧,我设置了我的种子,所以它们总是相同的,并且我没有更改/外部依赖项,因此我的代码的执行路径应该始终相同”,但这是错误的。

令我震惊的例子是 list(set(...)),其中生成的顺序可能有所不同。