【问题标题】:Why do I get different results with same random seed, same computer, same program为什么使用相同的随机种子、相同的计算机、相同的程序会得到不同的结果
【发布时间】:2016-02-05 18:30:46
【问题描述】:

我正在运行一个包含很多模块的模拟。 我使用随机数次。 我读了输入文件。 我使用四舍五入。 当然,我在程序的第一行设置了一个 random.seed(1),在导入 random 之后立即。

尽管如此,我不应该在同一台计算机上使用相同的输入文件运行相同的程序相同的参数得到完全相同的结果吗?

【问题讨论】:

  • random 模块不是程序中不确定性的唯一来源。你还在做什么?多线程?依赖dict迭代顺序?
  • 嗯...是的,我有字典。我从可能有很多相等数字的列表中得到最小值。
  • 代码有很多模块。论文正在审查中。接受后,我将提供所有内容。
  • 但是,有可能一切都是平等的,我仍然得到不同的结果?很奇怪
  • 从字典中获取最小值是否可能在不同的运行中给我不同的数字?

标签: python random seed


【解决方案1】:

将随机数的源作为服务注入到使用它的模块中。然后,您可以轻松地将其替换为提供预定义数字序列的确定性版本。例如,这是正确单元测试的先决条件,它也适用于时间等因素。

关于你的情况,你可以例如注入random.Random 的实例,而不是使用全局(random 模块提供的实例)。然后可以适当地播种此生成器(构造函数参数)以提供可重现的序列。

错误代码:

def simulation():
    sum = 0
    for i in range(10):
        sum += random.random()
    return sum / 10

# Think about how to test that code without
# monkey-patching random.random.

好代码:

def simulation(rn_provider):
    sum = 0
    for i in range(10):
        sum += rn_provider()
    return sum / 10

rng1 = random.Random(0)
sum1 = simulation(rng1.random)
rng2 = random.Random(0)
sum2 = simulation(rng2.random)
print(sum1 == sum2)

这里的代码使用了一个简单的函数参数。对于类,你也可以使用“依赖注入”。

顺便说一句:还记得听说全局变量不好吗?这是你的例子为什么。 ;)

【讨论】:

  • 嗯。我明白。但我不知道如何应用它。你的意思是一个随机类,在 my_random 中实例化?
  • 谢谢!我试试看!
  • 嗨@ulrich-eckhardt,我替换了所有随机选择(29 次)
  • 现在,我有 'fixed_seed = random.Random(1)' 并使用了 fixed_seed。但是,还是。结果不同
  • 好吧,也许是时候展示一些代码,以便其他人可以重现它。
猜你喜欢
  • 2016-06-03
  • 2019-05-31
  • 1970-01-01
  • 2016-09-16
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
相关资源
最近更新 更多