在python中设置程序范围内的随机种子


82

我有一个相当大的程序,在这里我使用random模块中不同文件中的函数。我希望能够在一个位置设置一次随机种子,以使程序始终返回相同的结果。可以做到python吗?

Answers:


116

运行的主要python模块应该import random并调用random.seed(n)-random只要其他位置未重置种子,其他所有导入都可以共享该模块。


3
我可以在不知道的地方重置种子吗?因为在主文件中只设置一次种子并不能解决问题
Mischa Obrecht

1
@MischaObrecht我猜是-种子仅在随机模块的第一次导入时初始化-如果导入多次,它将不会执行初始化和重置种子-因此代码中必须有一个显式调用
乔恩·克莱门茨

3
如果要从random模块级代码中调用方法,即要在main中导入,则在进入in main之前random.seed(n),这些调用将在种子之前进行,因此将花费时间,并且有效地不可复制随机。
罗素·博罗戈夫

12
如果事实证明某些第三方代码正在重新植入RNG(不太可能,但可能),请注意,您可以通过random.Random()构造函数创建具有独立状态的其他随机数生成器,并在严格可重复性很重要的情况下使用它们。
罗素·博罗戈夫

这对我不起作用。而且我没有可复制的代码。我猜我会检查所有导入的库文件的...(见stackoverflow.com/questions/37886997/...
乙朵

36

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

人们要注意的另一件事:如果使用 numpy.random,则需要使用numpy.random.seed()设置种子。使用random.seed()不会为从生成的随机数设置种子numpy.random。这让我有些困惑。-zss


绝对正确,如果您在应用程序中的某个位置使用的随机数,则random module说一个函数random.choices(),然后再进一步降低numpy随机数生成器的其他位置,假设np.random.normal()您必须为两个模块都设置种子。我通常做的是有一对夫妇在我行的main.pyrandom.seed(my_seed)np.random.seed(my_seed)。zss的荣誉
Aenaon

Sage也有类似的问题,因为它的PRNG与Python和numpy都不相同。使用set_random_seed()贤者。
布伦特·巴卡拉

8

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


3

乔恩·克莱门茨(Jon Clements)几乎回答了我的问题。但这不是真正的问题:事实证明,我的代码具有随机性的原因是numpy.linalg SVD,因为对于条件恶劣的矩阵,它并不总是产生相同的结果!

因此,如果您遇到相同的问题,请务必在代码中进行检查!


22
人们需要注意的另一件事:如果您使用的是numpy.random,则需要使用numpy.random.seed()设置种子。使用random.seed()不会为从numpy.random生成的随机数设置种子。这让我有些困惑。
2014年

1

基于先前的答案:请注意,即使所有种子都受到控制,许多构造也可以使执行路径有所不同。

我当时在想:“好吧,我设置好种子,使它们始终相同,并且没有更改/外部依赖关系,因此我的代码的执行路径应始终相同”,但这是错误的。

困扰我的示例是 list(set(...)),结果顺序可能有所不同。


好点,这以前把我烧死了。还有一些事情,例如从数据库中获取结果,除非您另外指定,否则它们也会无序返回(随机)
Justin Furuness

-14

您可以使用自己的随机数生成器轻松保证这一点。

只需选择三个比较大的素数(假设这不是密码应用程序),然后将它们插入到a,b和c中即可:a =((a * b)%c)这将提供一个生成相当随机数据的反馈系统。请注意,并非所有质数都能很好地工作,但是如果您只是在进行模拟,那没关系-大多数模拟的真正需要是一个杂乱无章的数字,其模式(伪随机,记住)足够复杂,以至于它在某种程度上与您的应用程序不匹配。

努斯谈到了这一点。


10
不需要自己动手,因为Python在其标准库中具有出色的随机数功能,如果您不知道自己在做什么,就很容易创建一个非常糟糕的生成器。
罗素·博罗戈夫

6
我同意这是一个非常糟糕的解决方案:在蒙特卡洛模拟(这就是我的程序)中,通常会收集数百万个样本,相关的随机数(从不良生成器中提取)很容易弄乱您的结果!
Mischa Obrecht 2012年

您的意思是,Knuth一直在谈论这个问题?即使现在?
意思就是意思
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.