我有一个相当大的程序,在这里我使用random
模块中不同文件中的函数。我希望能够在一个位置设置一次随机种子,以使程序始终返回相同的结果。可以做到python
吗?
我有一个相当大的程序,在这里我使用random
模块中不同文件中的函数。我希望能够在一个位置设置一次随机种子,以使程序始终返回相同的结果。可以做到python
吗?
Answers:
运行的主要python模块应该import random
并调用random.seed(n)
-random
只要其他位置未重置种子,其他所有导入都可以共享该模块。
random
模块级代码中调用方法,即要在main中导入,则在进入in main之前random.seed(n)
,这些调用将在种子之前进行,因此将花费时间,并且有效地不可复制随机。
random.Random()
构造函数创建具有独立状态的其他随机数生成器,并在严格可重复性很重要的情况下使用它们。
zss的评论应突出显示为实际答案:
人们要注意的另一件事:如果使用
numpy.random
,则需要使用numpy.random.seed()
设置种子。使用random.seed()
不会为从生成的随机数设置种子numpy.random
。这让我有些困惑。-zss
random module
说一个函数random.choices()
,然后再进一步降低numpy
随机数生成器的其他位置,假设np.random.normal()
您必须为两个模块都设置种子。我通常做的是有一对夫妇在我行的main.py
像random.seed(my_seed)
和np.random.seed(my_seed)
。zss的荣誉
set_random_seed()
贤者。
乔恩·克莱门茨(Jon Clements)几乎回答了我的问题。但这不是真正的问题:事实证明,我的代码具有随机性的原因是numpy.linalg SVD,因为对于条件恶劣的矩阵,它并不总是产生相同的结果!
因此,如果您遇到相同的问题,请务必在代码中进行检查!
基于先前的答案:请注意,即使所有种子都受到控制,许多构造也可以使执行路径有所不同。
我当时在想:“好吧,我设置好种子,使它们始终相同,并且没有更改/外部依赖关系,因此我的代码的执行路径应始终相同”,但这是错误的。
困扰我的示例是 list(set(...))
,结果顺序可能有所不同。
您可以使用自己的随机数生成器轻松保证这一点。
只需选择三个比较大的素数(假设这不是密码应用程序),然后将它们插入到a,b和c中即可:a =((a * b)%c)这将提供一个生成相当随机数据的反馈系统。请注意,并非所有质数都能很好地工作,但是如果您只是在进行模拟,那没关系-大多数模拟的真正需要是一个杂乱无章的数字,其模式(伪随机,记住)足够复杂,以至于它在某种程度上与您的应用程序不匹配。
努斯谈到了这一点。