【问题标题】:Gamma distributed random variables in C++C ++中的伽马分布随机变量
【发布时间】:2011-03-31 12:39:03
【问题描述】:

在 C++ 中获取伽马分布随机变量的最简单方法是什么? Boost似乎有这个功能,但我不清楚如何使用它。

【问题讨论】:

    标签: c++ boost random gamma-distribution


    【解决方案1】:

    这很简单:

    boost::mt19937 rng;
    boost::gamma_distribution<> pdf(alpha);
    boost::variate_generator<boost::mt19937&, boost::gamma_distribution<> >
        generator(rng, pdf);
    

    构造一个随机数生成器和一个gamma distribution 并将它们粘合到一个可用的生成器中。现在您可以通过调用generator 创建随机数。

    【讨论】:

    • @stony*nick 不幸的是,Boost doesn’t seem to have it 但是一旦您了解了其他发行版的实现方式以及 PDF 的定义方式,实现起来应该不会太难。
    • @stony*nick:“beta”是指比例参数或速率参数。在第一种情况下,将变量乘以 beta,否则除以。
    【解决方案2】:

    这是在 C++11 中的操作方式:

    #include <random>
    #include <iostream>
    
    int main()
    {
        typedef std::mt19937 G;
        typedef std::gamma_distribution<> D;
        G g;  // seed if you want with integral argument
        double k = .5;      // http://en.wikipedia.org/wiki/Gamma_distribution
        double theta = 2.0;
        D d(k, theta);
        std::cout << d(g) << '\n';
    }
    

    您的编译器可能支持也可能不支持&lt;random&gt;。 Boost random 刚刚被修改为符合 std::syntax,但我不确定该修改是否已经真正发布(或者仍然只是在 boost 主干上)。

    【讨论】:

      【解决方案3】:

      看起来Gamma Distribution in Boost 有一些代码可以满足您的需求。您可能缺少的是boost::variate_generator

      【讨论】: