尝试的问题:两个骰子中的一个骰子的值高于第三个骰子的概率。
问题:出于某种原因,当我使用python中的random
模块(特别是示例方法)时,我最终会得到一个不同的(并且不正确的)结果使用numpy。我在底部包含了结果。重复执行代码会产生类似的结果。任何想法,为什么random.sample
方法和numpy.random.random_integers
具有不同的结果,即使它们具有相同的功能?
import numpy as np
import random
random_list = []
numpy_list = []
n= 500
np_wins = 0
rand_wins = 0
for i in range(n):
rolls = random.sample(range(1,7), 3)
rand_wins += any(rolls[0] < roll for roll in rolls)
rolls = np.random.random_integers(1, 6, 3)
np_wins += any(rolls[0] < roll for roll in rolls)
print "numpy : {}".format(np_wins/(n * 1.0))
print "random : {}".format(rand_wins/(n * 1.0))
结果:
Press ENTER or type command to continue
numpy : 0.586
random : 0.688
答案 0 :(得分:4)
观察到差异的原因是random.sample
样本没有替换(见here),而numpy.random.random_integers
样本有替换。
答案 1 :(得分:3)
random.sample()
会阻止双值。这就像绘制数字而不替换它们一样,因此[ 1, 1, 1 ]
之类的结果永远不会发生。
np.random.random_integers()
是你真正想要的,如果你模拟三个掷骰子。
您可以将random.sample()
替换为[ random.randint(1, 6) for _ in range(3) ]
,以达到相同的效果。
答案 2 :(得分:2)
这里有两个问题(一个小问题,一个重要问题):
您的样本量非常小,无法获得良好的效果。如果我只做500卷,我得到0.55和0.62之间的结果。很难准确。
random.sample
从给定的序列中选择3项而不将它们放回。所以你没有做三个骰子,你从[1,6]范围内挑选三个不同的数字。
事实上,如果我这样做,概率为67%,而你所说的问题则超过58%,正如你所观察到的那样。
我使用的PowerShell测试代码:
原始问题陈述:
(1..500 | %{
$r = 0..2 | %{ Get-Random -min 1 -max 7 }
!!($r|?{$r[0] -lt $_})
} | measure -ave).Average
你有缺陷的方法:
(1..500 | %{
$r = 1..6 | Get-Random 3
!!($r|?{$r[0] -lt $_})
} | measure -ave).Average
那些产生了与您观察到的相同的结果差异。