【问题标题】:Calculating probability using std::binomial_distribution使用 std::binomial_distribution 计算概率
【发布时间】:2017-04-28 15:34:06
【问题描述】:

是否可以使用 std::binomial_distribution 计算在 k 次试验中获得 n 次成功的概率?怎么样?

【问题讨论】:

    标签: c++ c++11 statistics probability


    【解决方案1】:

    确实没有。

    std::binomial_distribution 更像是随机数生成的适配器,而不是可以提供累积密度函数的东西。

    您可以自己在几行代码中实现累积密度函数,或者搜索一个好的数学库。 (使用帕斯卡三角法,而不是计算大的阶乘数)。

    【讨论】:

    • 我遇到了阶乘溢出问题,我正在使用递归方式:en.wikipedia.org/wiki/Binomial_coefficient#Recursive_formula 这是个好主意吗?
    • @Bathsheba:我的意思是你可以使用std::binomial_distribution 来做到这一点,如果你想通过随机抽样/大数定律来做到这一点,而不是仅仅明确地计算出来。我认为这是 OP 的家庭作业的一部分,以两种方式或其他方式进行。
    【解决方案2】:

    要实现这样的 PMF,比如Binomial

    PMF(p, n,k) = n!/(k!*(n-k)!) p^k (1-p)^(n-k)
    

    好办法是计算它的对数并取幂

    对于log 的阶乘,您必须使用伽玛函数的对数

    顺其自然(未经测试!)

    double logChoose(int n, int k) {
        return std::lgamma(double(n+1)) - std::lgamma(double(k+1)) - std::lgamma(double(n-k+1));
    }
    
    double PMFBinomial(double p, int n, int k) {
        double lgr = logChoose(n, k) + double(k)*std::log(p) + double(n-k)*std::log(1-p);
        return std::exp(lgr);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2016-07-28
      • 2011-09-30
      相关资源
      最近更新 更多