具有2个球的容器,一个是红色,第二个是黑色。
每次抽出一个球并再次放入容器中。球的绘制时间为n
次1<=n<=10^6
。我想找出至少r
所绘红球的概率0<=r<=n
。例如,让n=3
和r=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!
。
它也可以使用二项分布来解决。
但是,对于给定的n
和r
,很难计算。
答案 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
中找到实现