如何从给定的容器中找出抽球的概率?

时间:2017-02-13 06:21:54

标签: c++ algorithm probability combinatorics

具有2个球的容器,一个是红色,第二个是黑色。 每次抽出一个球并再次放入容器中。球的绘制时间为n1<=n<=10^6。我想找出至少r所绘红球的概率0<=r<=n。例如,让n=3r=2然后概率p可以计算为:

p=( C(3,2)+C(3,3) ) / (2^3)
p=(3+1)/8
p=0.5

其中C(n,r) = n!/(n-r)!r!。 它也可以使用二项分布来解决。 但是,对于给定的nr,很难计算。

1 个答案:

答案 0 :(得分:4)

您可以尝试使用对数,即代替

 P(r, n) = n! / ((n-r)! * r! * r**n)

仅计算

 log(P(r, r)) = log(n!) - log((n-r)!) - log(r!) - r*log(n)

所有因子都很容易计算为对数:

 log(n!) = log(n) + log(n - 1) + ... + log(2) + log(1)

获得log(P(r, n))时,您所要做的就是取幂。作为进一步改进,如果n很大,您可以使用Stirling's approximation作为因子:

 n! ~ (n / e)**n * sqrt(2 * PI * n)

so(ln代表自然对数)

 ln(n!) ~ n * ln(n) - n - ln(n)/2 - ln(2 * PI)/2  

修改:如果您正在寻找 CDF 累积分布函数,则给定{{1}的随机值小于或等于的概率}),它可以表示为正则化的不完全beta函数

https://en.wikipedia.org/wiki/Binomial_distribution

x

如果是C ++,可以在Boost

中找到实现