我仍然是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计数始终过高。我觉得我的代码很简单,但不知何故,我似乎比我应该更多地计算双白。
任何人都可以提供的帮助将非常感激!
谢谢!
答案 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的行为(我强烈推荐它!)。