给定p,k的概率胜出n。

时间:2019-05-25 17:31:36

标签: python probability combinatorics

给定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)

此代码有效,但是是否有内置功能,或者有更短的方法实现相同功能?

2 个答案:

答案 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的有效组合计算功能