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

时间:2013-10-15 17:21:24

标签: c++ boost c++11 stl probability-density

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

我知道我可以编码概率密度&amp;质量函数用于我自己的任何分布(参见下面的单个随机变量示例),但如果可以,我宁愿使用标准库。

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;
}

3 个答案:

答案 0 :(得分:9)

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

至于为什么这不包含在标准库中的理由,请参阅working paper 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
}

Live Example

答案 1 :(得分:0)

此外,如果您已经使用C ++ 17,那么有一个有用的opensouce库RandLib。在你的例子中,你可以写

#include “RandLib.h”

void main() {
    double lambda = 1;
    ExponentialRand X(lambda);
    X.f(0); //=1
}

答案 2 :(得分:-1)

@dudu

我不知道您使用的是哪种编译器,但请记住,Microsoft Visual C ++编译器不支持long double原型。 这样的支持将迫使编译器发出x87浮点代码。