能够使用std <random>生成不同prob分布的随机数是很好的。现在,是否可以使用标准库__计算给定分布的一组数字的概率及其参数__?
我知道,我可以自己为任何发行版编写概率密度和质量函数(请参见下面的一个随机变量示例),但如果可以的话,我宁愿使用标准库。
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;
}发布于 2013-10-16 08:25:59
自C++11以来,标准库包含了一组可用于生成随机数的发行版。不幸的是,标准库中没有计算概率密度、累积分布或分位数函数的功能。
至于为什么标准库中没有包括这一点,请参阅工作文件N1398 (强调我)
一些库提供给定分布的概率密度函数,作为该分布接口的一部分。虽然这可能偶尔是有用的,但这一提议没有规定这样的特点。原因之一是关注点的分离:根据分布参数预计算大型值表可能会使分发类模板受益,而概率密度函数的计算则不会。此外,函数表示通常很简单,因此用户可以轻松地自己对其进行编码。
我不太同意这样的推理:虽然密度函数确实很容易编码,但对于累积分布或分位数函数却不成立。
作为一种解决办法,您可以去Boost数学工具包。它对发行版使用与标准库相同的名称,但允许计算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
}实例化。
发布于 2017-11-01 17:19:42
此外,如果您已经在使用C++17,则有一个有用的开源库RandLib。在您的示例中,您只需编写
#include “RandLib.h”
void main() {
double lambda = 1;
ExponentialRand X(lambda);
X.f(0); //=1
}发布于 2015-09-15 15:52:56
@杜杜
我不知道您使用的是哪个编译器,但请记住,MicrosoftVisualC++编译器不支持长双原语类型。这种支持将迫使编译器发出x87浮点代码。
https://stackoverflow.com/questions/19387222
复制相似问题