Python随机不起作用

时间:2014-07-16 10:09:54

标签: python numpy random

尝试的问题:两个骰子中的一个骰子的值高于第三个骰子的概率。

问题:出于某种原因,当我使用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

3 个答案:

答案 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)

这里有两个问题(一个小问题,一个重要问题):

  1. 您的样本量非常小,无法获得良好的效果。如果我只做500卷,我得到0.55和0.62之间的结果。很难准确。

  2. random.sample从给定的序列中选择3项而不将它们放回。所以你没有做三个骰子,你从[1,6]范围内挑选三个不同的数字。

    事实上,如果我这样做,概率为67%,而你所说的问题则超过58%,正如你所观察到的那样。

  3. 我使用的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
    

    那些产生了与您观察到的相同的结果差异。