我有一个非常大的Python模拟,有很多模块。我调用了很多随机函数。为了保持相同的随机结果,我有一个变量 keep_seed_random。
这样:
import random
keep_seed_random = True
if keep_seed_random is False:
fixed_seed = random.Random(0)
else:
fixed_seed = random
然后我在整个程序中使用fixed_seed,例如
fixed_seed.choice(['male', 'female'])
fixed_seed.randint()
fixed_seed.gammavariate(3, 3)
fixed_seed.random()
fixed_seed.randrange(20, 40)
等等...
它曾经运作良好。 但现在,程序太大了,有其他因素干扰,结果不再相同,即使我选择 keep_seed_random = False
我的问题是 Python 中是否还有我遗漏的其他随机性来源?
附注我只随机导入一次。
已编辑
我们一直在努力查明程序从完全相同的结果转变为不同结果的确切时刻。似乎是当我们引入大量的数据库读取而与随机模块无关时。
结果现在在两个相似的结果之间交替。 也就是说,我运行 main.py 一旦得到 GDP 结果 8148.78 我再次运行,得到 7851.49 再次8148.78回来 又7851.49
对于工作版本,在更改之前,第一个结果(当我们创建实例并 pickle 保存它们时)我得到一个结果。然后,从第二次开始,结果都是一样的。所以,我猜测这与 pickle 读取/加载有关。
问题仍然存在!
第二次编辑
我们部分发现了问题。 问题是当我们创建实例和pickle转储然后pickle加载时。
我们仍然无法获得创建和加载完全相同的结果。 然而,当重复加载时,结果是准确的。
因此,问题出在 PICKLE 上 转储和加载时可能会发生一些随机化(我猜)。
谢谢
最佳答案
正如 @mart0903 提到的,如果没有良好的重现案例,这很难诊断。然而,一般来说,可能出现多种随机性来源。我想到了一些事情:
例如,如果您使用 multiprocessing
和/或 subprocess
包来生成多个并行进程,则可能会遇到竞争条件。也就是说,每次运行程序时,不同的进程在不同的时间完成。也许您正在以某种方式组合结果,该方式取决于这些线程以特定顺序执行。
也许您只是简单地循环字典并期望键按特定顺序排列,而事实上,字典没有排序。例如,连续运行以下几次(我使用的是 Python 3.5,以防万一),您会注意到键值对每次都以不同的顺序打印:
if __name__=='__main__':
data = dict()
data['a'] = 6
data['b'] = 7
data['c'] = 42
for key in data:
print(key + ' : ' + str(data[key]))
您甚至可能正在查看时间戳或设置一些值,或者可能在计算中使用的某个地方生成一个 uuid。
可能性还会继续存在。但同样,如果没有简单的重现案例,就很难确定。它可能只需要一些好的断点和大量的单步执行代码。
祝你好运!
关于python - 在 python 中使用 random.Random(0) 保持模拟确定性时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37886997/