首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用标准库的概率密度函数?

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

Stack Overflow用户
提问于 2013-10-15 17:21:24
回答 3查看 8.3K关注 0票数 6

能够使用std <random>生成不同prob分布的随机数是很好的。现在,是否可以使用标准库__计算给定分布的一组数字的概率及其参数__?

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

代码语言:javascript
复制
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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-16 08:25:59

自C++11以来,标准库包含了一组可用于生成随机数的发行版。不幸的是,标准库中没有计算概率密度、累积分布或分位数函数的功能。

至于为什么标准库中没有包括这一点,请参阅工作文件N1398 (强调我)

一些库提供给定分布的概率密度函数,作为该分布接口的一部分。虽然这可能偶尔是有用的,但这一提议没有规定这样的特点。原因之一是关注点的分离:根据分布参数预计算大型值表可能会使分发类模板受益,而概率密度函数的计算则不会。此外,函数表示通常很简单,因此用户可以轻松地自己对其进行编码。

我不太同意这样的推理:虽然密度函数确实很容易编码,但对于累积分布或分位数函数却不成立。

作为一种解决办法,您可以去Boost数学工具包。它对发行版使用与标准库相同的名称,但允许计算pdf()和这些发行版的更多属性。Boost库通常会找到进入标准的途径,如果不是,它们至少是独立于平台的和广泛可用的。你的例子应该是:

代码语言:javascript
复制
#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
}

实例化。

票数 10
EN

Stack Overflow用户

发布于 2017-11-01 17:19:42

此外,如果您已经在使用C++17,则有一个有用的开源库RandLib。在您的示例中,您只需编写

代码语言:javascript
复制
#include “RandLib.h”

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

Stack Overflow用户

发布于 2015-09-15 15:52:56

@杜杜

我不知道您使用的是哪个编译器,但请记住,MicrosoftVisualC++编译器不支持长双原语类型。这种支持将迫使编译器发出x87浮点代码。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19387222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档