个袋子中有红球m个,白球n个。现在要从中取出x个球。那么红球数目多于白球的概率是多少呢?
下面的代码解决了这个问题。其中的y表示红球至少出现的次数。
这与前文的问题是等价的。因为如果取30个球,要求红球数大于白球数
该题目由递归出口很容易看出是一个递归题目,m/(m+n)是第一个球是红球的概率,再调用递归求接下来再取到红球概率
n/(m+n)是第一个球是白球的概率,调用递归求接下来取到红球概率,两者情况相加即可
def pro(m, n, x, y):
#m袋中红球数目,n袋中白球数目,x需取出的数目,y红球至少次数
if y>x:
return 0
if y==0: #红球至少是0,则怎么拿无所谓
return 1
if x - n > y: 拿完白球后,还要拿的红球数就比白球多,必然概率为1
return 1
p1 = n/(m+n) * pro(m, n-1, x-1, y)
p2 = m/(m+n) * pro(m-1, n, x-1, y-1)
return p1 + p2
print(pro(5,5,5,3))