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

在python中使用random.random(0)保持模拟确定性时遇到问题,python,random,deterministic,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.choice(['mal

我有一个非常大的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.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加载时

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

因此,问题在于泡菜 倾倒和装载时可能会出现一些随机化(我猜)


谢谢,

如果没有@mart0903提到的好病例,这很难诊断。然而,一般来说,有几个随机性的来源可以发生。我想到了几件事:

例如,如果您正在使用
多处理
和/或
子进程
包来生成多个并行进程,则可能会遇到争用情况。也就是说,每次运行程序时,不同的进程在不同的时间完成。也许您正在以某种方式组合结果,这取决于这些线程以特定顺序执行

也许您只是简单地在字典上循环,并期望键按特定顺序排列,而实际上,字典是没有顺序的。例如,连续几次运行以下命令(我使用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

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


祝你好运

我会尽量缩小程序的范围,找到能够重现问题的最小代码。这个问题现在很难回答,我知道。这就是重点。我不知道随机性可能来自哪里。。。谢谢@mart0903。说得好。我看了!但在视频的例子中,它解决了一个非常具体的问题。这对我来说可能是不同的…谢谢,但我不使用多重处理。我也没有像你在这里建议的那样使用关键字典。我猜问题来自于导入一个或另一个库。特别是,我使用osgeo、ogr、pandas、numpy、pickle、subprocess、sys、os、geopandas、shapely、ggplot、glob、itertools、operatorAh、yes<代码>子进程可以让您像多处理包一样容易陷入竞争状态,如果您一次运行多个子进程包的话。这基本上是一样的。如果你有两个过程,并且你的结果取决于它们完成的顺序,你肯定会遇到同样的事情。我将更新上面的答案,以包括
子流程
。但只有在我多次运行模拟时才会调用子流程。在一次运行中,不会从问题中调用main.py,然后不会使用子流程。。。我认为随机性的来源可能来自另一个图书馆!正如你所说,那肯定是另一个图书馆。没有缩小的病例很难诊断。谢谢!我已经重新编写了所有代码,包括setseed、saveseed、checked numpy.seed,但仍然存在问题。我还检查了所有的解决方案,没有结果。问题是它是一个完整的程序,有25个模块和一些必要的阅读数据库。也许我应该在GitHubt上分享,但我还没有提交任何论文。。。