python - 为什么使用相同的随机种子、相同的计算机、相同的程序会得到不同的结果

标签 python random seed

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

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

最佳答案

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

关于你的情况,你可以例如注入(inject)一个 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)

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

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

关于python - 为什么使用相同的随机种子、相同的计算机、相同的程序会得到不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35231087/

相关文章:

python - 如何使用 setuptools *安装*额外的包数据?

python - 如何在 QScintilla 中使用自定义折叠图标?

java - 使用jython从python访问java类

random - 如何在 Ocaml 中随机选择一个元素?

ruby-on-rails - Rails/Mina Gem 创建自定义任务以进行播种

python - 随机种子如何在 Python 的函数工厂中工作?

c++ - 具有相同种子的 rand() 函数是否会在不同的 PC 上给出相同的随机数?

python - 从模板克隆时如何将磁盘添加到 VM?

c - 初始化数组时随机数生成器出错

javascript - 在经常调用的函数中获取粘性随机数(Javascript)