能够使用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;
}
答案 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
}
答案 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浮点代码。