为什么我使用相同的随机种子、相同的计算机、相同的程序得到不同的结果
Why do I get different results with same random seed, same computer, same program
我是运行一个模块很多的模拟。
我多次使用随机。
我读了输入文件。
我使用舍入。
当然,我在我的程序的第一行设置了一个 random.seed(1),在导入 random.
之后立即
尽管如此,我不应该得到完全相同的结果吗运行相同的程序相同的参数在同一台计算机上使用相同的输入文件?
将随机数源作为服务注入到使用它的模块中。然后,您可以轻松地将其替换为提供预定义数字序列的确定性版本。例如,这是进行适当单元测试的先决条件,它也适用于诸如时间之类的事情。
关于你的情况,你可以,例如注入 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)
这里的代码使用了一个简单的函数参数。对于 类,您还可以使用 "dependency injection".
顺便说一句:还记得听说全局变量不好吗?这是您的示例原因。 ;)
我是运行一个模块很多的模拟。 我多次使用随机。 我读了输入文件。 我使用舍入。 当然,我在我的程序的第一行设置了一个 random.seed(1),在导入 random.
之后立即尽管如此,我不应该得到完全相同的结果吗运行相同的程序相同的参数在同一台计算机上使用相同的输入文件?
将随机数源作为服务注入到使用它的模块中。然后,您可以轻松地将其替换为提供预定义数字序列的确定性版本。例如,这是进行适当单元测试的先决条件,它也适用于诸如时间之类的事情。
关于你的情况,你可以,例如注入 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)
这里的代码使用了一个简单的函数参数。对于 类,您还可以使用 "dependency injection".
顺便说一句:还记得听说全局变量不好吗?这是您的示例原因。 ;)