我正在运行带有很多模块的模拟。 我多次使用随机。 我读取输入文件。 我使用舍入。 当然,我在导入 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/