使用numpy.random.choice没有替换从包中绘制项目

时间:2017-03-14 01:45:42

标签: python numpy

我仍然是python的新手,正在为课堂解决问题。我觉得我真的很接近解决方案,但我的数字仍未出现我对概率的期望。

在问题中,我们有一个内置两个芯片的包。我们知道其中一个芯片是白色的,另一个是黑色或白色。每次我们玩游戏时这些条件都是正确的。

在游戏中,我们从包中取出一个芯片,它是白色的。问题是编写一个近似于从袋子中抽出两个白色芯片的概率的函数。函数的参数是我们玩游戏的次数。

这是我到目前为止编写的代码:

def prob_two_whites(num):
    counter = 0     #counts the number of iterations or games played
    first_white = 0     #counts how many times the first pull was white
    double_white = 0    #counts how many times the second pull was white, if the first was also white
    while counter < num:    #runs a game until total number of games is reached
        chip_1 = "white"    #this is the chip we know is white
        chip_2 = np.random.choice(["white","black"])    #chip two has an equal chance of being white or black for each game
        result = np.random.choice([chip_1, chip_2], 2, replace = False)   #drawing both chips without replacement
        if result[0] == "white":    #if the first chip pulled is white
            first_white += 1        # add one to the first white
            if result[1] == "white":    #if the second pull was white, given the first was also white
                double_white += 1       # add one to double_white
        counter +=1          #add one to the counter
    return (float(double_white)/float(first_white)) / (float(first_white)/float(counter))

实际上,结果应该是大约66.66%

概率地说,第一次拉白的几率是75%。一旦拉出第一个白色,第二次拉动就有大约50%的可能性为白色。

当我查看first_white和double_white的不同计数时,first_white数字似乎正在计算(约占总计数的75%),但我的double_white计数始终过高。我觉得我的代码很简单,但不知何故,我似乎比我应该更多地计算双白。

任何人都可以提供的帮助将非常感激!

谢谢!

1 个答案:

答案 0 :(得分:0)

我的问题不在于任何随机数生成或计数,而是在最后进行概率计算。

在第一个结果是白色的情况下获得两个白色结果的条件概率是double_white / first_white(简单地将两个计数除以)。这是他们独立概率比率的简化形式:(double_white / count) / (first_white / count)(请注意count可以取消)

通常贝叶斯定律会说,在划分这些概率或计数时,分子中需要有一个额外的项。但是当它发生时,额外的术语是反转的条件概率(如果它们都是白色的话,第一个芯片是白色的概率)是100%(或1)。乘以1不会做任何事情,因此可以将其排除在计算之外。

为了清晰起见,我省略了上面的所有float次调用,因为它们确实不是必需的。如果您使用的是Python 3,则默认情况下,两个整数之间的除法将生成float结果(您可以使用//楼层除法运算符明确请求整数除法)。如果您仍然坚持使用Python 2,那么如果您将from __future__ import division放在文件的顶部,则可以获得Python 3的行为(我强烈推荐它!)。