给定n个审判,并且每个审判胜出的概率为p,赢得r个或更多审判的概率是多少?
我的想法如下: 获胜和失败的每种组合的概率为p ^ w *(p-1)^(n-w),其中w是获胜次数。
每次获胜都可以在nCr组合中进行,例如。 3次赢得2次意味着您可能会第一次,第二次或第三次失败。三种组合。
因此,三分之二的获胜概率为3C2 * p ^ 2 *(1-p)^ 1。 赢得2次或更多次的几率只是此2次和3次胜利的总和。
我有以下代码:
import math
def nCr(n,r):
f = math.factorial
return f(n) / f(r) / f(n-r)
def prob_at_least(n, r, p):
probs = [nCr(n,k)*pow(p,k)*pow(1.0-p,n-k) for k in range(r, n+1)]
return sum(probs)
此代码有效,但是是否有内置功能,或者有更短的方法实现相同功能?
答案 0 :(得分:2)
在foreach
模块中,您可以使用This is a message with multiple links: <a href="http://google.com">http://google.com</a> <a href="http://twitter.com">http://twitter.com</a> <a href="http://google.com">http://google.com</a>/qwerty <a href="http://facebook.com">http://facebook.com</a> <a href="http://google.com">http://google.com</a>/ytrewq
。
This is a message with multiple links: <a href="http://google.com">http://google.com</a> <a href="http://twitter.com">http://twitter.com</a> <a href="http://google.com/qwerty">http://google.com/qwerty</a> <a href="http://facebook.com">http://facebook.com</a> <a href="http://google.com/ytrewq">http://google.com/ytrewq</a>
编辑:获取r或更多:
scipy.stats
编辑:ljeabmreosn提供的解决方案提供了不需要我的循环的累积分布函数。
答案 1 :(得分:1)
有much faster ways to implement combinations:
import operator as op
from functools import reduce
def nCr(n, r):
r = min(r, n-r)
numerator = reduce(op.mul, range(n, n-r, -1), 1)
denominator = reduce(op.mul, range(1, r+1), 1)
return numerator / denominator
但是,如果您经常这样做,则可能需要考虑像scipy这样的软件包,该软件包具有special.comb
的有效组合计算功能