在 python 中使用 random.Random(0) 保持模拟确定性存在问题

Having problems keeping a simulation deterministic with random.Random(0) in python

我在 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 中是否还有其他我遗漏的随机性来源?

P.S。我只随机导入一次。

已编辑

我们一直在尝试确定程序从完全相同的结果变为不同结果的确切时刻。好像是我们引入大量读取数据库的时候,没有连接到随机模块。

结果现在在两个相似的结果中交替出现。 也就是我运行main.py一次得到GDP的结果是8148.78 我再次 运行 我得到 7851.49 再次返回 8148.78 再次 7851.49

同样对于工作版本,在更改之前,第一个结果(当我们创建实例并 pickle 保存它们时)我得到一个结果。然后,从第二个开始,结果是一样的。所以,我猜它与 pickle reading/loading.

有关

问题依旧!

第二次编辑

我们部分发现了问题。 问题是当我们创建实例和 pickle dump 然后 pickle load 时。

我们仍然无法获得完全相同的创建和加载结果。 但是,当重复加载时,结果是准确的。

因此,问题出在PICKLE 转储和加载时可能会发生一些随机化(我猜)。

谢谢,

如@mart0903 所述,如果没有良好的重现案例,这很难诊断。但是,一般来说,可能会出现多种随机性来源。我想到了一些事情:

例如,如果您正在使用 multiprocessing and/or 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。

可能性还会继续。但同样,如果没有简单的复制案例,就很难确定。它可能只需要一些好的断点和大量单步执行代码。

祝你好运!