使用标准库的概率密度函数?

dud*_*udu 6 c++ boost stl c++11 probability-density

能够使用它std <random>来生成不同概率分布的随机数很好......现在,有没有办法使用标准库计算给定分布及其参数的一组数字的概率?

我知道我可以为我自己的任何发行版编写概率密度和质量函数(参见下面的单个随机变量示例),但如果可以,我宁愿使用标准库.

long double exponential_pdf(long double x, long double rate) {

    if ( x < 0.0 ) {
        return 0.0;
    }
    if ( rate < 0.0 ) {
        return NOT_A_NUMBER;
    }
    auto    pdf = rate * exp( - rate * x);
    return  pdf;
}
Run Code Online (Sandbox Code Playgroud)

Tem*_*Rex 10

从C++ 11开始,标准库包含一堆可用于生成随机数的分布.不幸的是,在标准库中没有用于计算概率密度,累积分布或分位数函数的功能.

至于为什么不包括在标准库中的理由,请参阅工作文件N1398(强调我的)

一些库提供给定分布的概率密度函数作为该分布的接口的一部分.虽然这可能偶尔会有用,但此提案并未提供此类功能.一个原因是关注点分离:分布类模板可能会受益于根据分布参数预先计算大型值表,而概率密度函数的计算则不然.此外,函数表示通常很简单,因此用户可以自己轻松编写代码.

我并不完全同意这种推理:虽然密度函数很容易编码,但对于累积分布或分位数函数来说却同样如此.

作为一种解决方法,您可以访问Boost Math Toolkit.它使用与分发的标准库相同的名称,但允许您pdf()为这些分发计算和更多属性.Boost库经常进入标准,如果没有,它们至少是平台独立的并且可以广泛使用.你的例子是这样的:

#include <iostream>
#include <boost/math/distributions/exponential.hpp>

using namespace boost::math;

int main() 
{
    auto const lambda = 1.0;
    auto d = exponential_distribution<>{lambda};
    std::cout << pdf(d, 0) << "\n"; // exp(0) = 1
    std::cout << pdf(d, 1) << "\n"; // exp(-1) = 0.367879
}
Run Code Online (Sandbox Code Playgroud)

实例.