98

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

4

9 回答 9

140

运行的主要 python 模块应该import random和调用-只要其他地方不重置种子,random.seed(n)它就会在所有其他导入之间共享。random

于 2012-07-17T16:38:43.820 回答
48

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

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

于 2018-01-02T05:42:40.483 回答
9

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

于 2012-07-17T16:44:32.723 回答
4

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

因此,如果您有同样的问题,请务必在您的代码中检查它!

于 2012-07-18T11:11:08.640 回答
3

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

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

咬我的例子是 list(set(...)),结果顺序可能不同。

于 2020-04-18T14:06:00.713 回答
0

一个重要的警告是,对于 3.7 之前的 python 版本,字典键不是确定性的。这可能导致程序中的随机性,甚至导致随机数生成的顺序不同,因此产生不确定的随机数。结论更新python。

于 2020-11-30T10:10:43.237 回答
0

在复现一个深度学习项目的时候,我也对这个问题感到困惑。所以我做了一个玩具实验,把结果分享给大家。

我在一个项目中创建了两个文件,分别命名为test1.pytest2.py。在test1中,我random.seed(10)random模块设置并多次打印 10 个随机数。正如您可以验证的那样,结果总是相同的。

怎么样test2?除了为模块设置种子外,我采用相同的方式random。每次显示的结果都不同。但是,只要我 import test1———即使不使用它,结果看起来与test1.

所以实验得出的结论是,如果要为项目中的所有文件设置种子,则需要导入定义和设置种子的文件/模块。

于 2021-08-27T08:19:57.010 回答
0

根据乔恩的回答random.seed(n),在主程序的开头设置, 将全局设置种子。之后设置导入库的种子,可以使用random.random(). 例如,

rng = np.random.default_rng(int(abs(math.log(random.random()))))

tf.random.set_seed(int(abs(math.log(random.random()))))
于 2021-12-23T07:50:22.893 回答
-15

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

只需选择三个较大的素数(假设这不是密码学应用程序),并将它们插入 a、b 和 c: a = ((a * b) % c) 这给出了一个产生相当随机数据的反馈系统。请注意,并非所有素数都同样有效,但如果您只是在进行模拟,那应该没关系 - 大多数模拟真正需要的只是一堆具有足够复杂模式(伪随机,请记住)的数字它在某种程度上与您的应用程序不匹配。

Knuth 谈到了这一点。

于 2012-07-17T17:20:11.847 回答