gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:24:28 26 4
gpt4 key购买 nike

能够使用 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;
}

最佳答案

自 C++11 起,标准库包含一堆可用于随机数生成的分布。遗憾的是,标准库中没有计算概率密度、累积分布或分位数函数的功能。

至于为什么这没有包含在标准库中,请参阅 working paper N1398 (强调我的)

Some libraries provide the probability density function of a given distribution as part of that distribution's interface. While this may be useful occasionally, this proposal does not provide for such a feature. One reason is separation of concerns: The distribution class templates might benefit from precomputing large tables of values depending on the distribution parameters, while the computation of the probability density function does not. Also, the function representation is often straightforward, so the user can easily code it himself.

我不太同意这个推理:虽然密度函数确实很容易编写代码,但累积分布或分位数函数却并非如此。

作为解决方法,您可以转到 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 .

关于c++ - 使用标准库的概率密度函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19387222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com