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

时间:2016-06-17 17:16:28

标签: python random deterministic

我在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。我只输入一次随机。

EDITED

我们一直在努力查明程序从完全相同的结果转换为不同结果的确切时刻。这似乎是我们引入大量数据库读取而没有连接到随机模块的时候。

结果现在在两个相似的结果中交替显示。 也就是说,我运行main.py一次得到8148.78的GDP结果 我再跑一次,得到7851.49 再次8148.78回来 再次7851.49

对于工作版本,在更改之前,第一个结果(当我们创建实例和pickle保存它们时)我得到一个结果。然后,从第二个开始,结果是相同的。所以,我猜它与泡菜阅读/装载有关。

问题仍然存在!

第二次编辑

我们部分地发现了这个问题。 问题是我们创建实例和pickle dump然后pickle加载。

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

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

谢谢,

1 个答案:

答案 0 :(得分:1)

如果没有良好的重现案例,这很难诊断,因为@ 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。

可能性继续存在。但同样,如果没有简单的重现案例,很难确定。它可能只需要一些好的断点和许多单步执行代码。

祝你好运!