我正在使用大量模块运行模拟。 我随机使用了很多次。 我读了输入文件。 我用四舍五入。 当然,我在我的程序的第一行中设置了random.seed(1),在随机导入之后立即。
即使在相同的计算机中使用相同的输入文件运行相同的程序相同的参数,我不应该得到完全相同的结果吗?
答案 0 :(得分:2)
使用它将随机数源作为服务注入模块。然后,您可以使用确定性版本轻松替换它,该版本提供预定义的数字序列。例如,这是正确单元测试的先决条件,也适用于时间等事项。
关于你的情况,你可以例如注入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)
此处的代码使用简单的函数参数。对于类,您还可以使用“依赖注入”。
顺便说一句:还记得听说全局变坏了吗?这是你的例子。 ;)