c++ - 来自 Beta 分布的随机数,C++

标签 c++ boost boost-random beta-distribution

我用 C++ 编写了一个模拟,它根据特定的概率分布生成 (1,000,000)^2 个数字,然后用它们做一些事情。到目前为止,我已经使用了指数分布、正态分布、 Gamma 分布、均匀分布和泊松分布。这是其中一个的代码:

#include <boost/random.hpp>

...main...

    srand(time(NULL)) ;
    seed = rand();
    boost::random::mt19937 igen(seed) ;
    boost::random::variate_generator<boost::random::mt19937, boost::random::normal_distribution<> >
    norm_dist(igen, boost::random::normal_distribution<>(mu,sigma)) ;

现在我需要为 Beta 发行版运行它。到目前为止,我完成的所有分发都花了 10-15 个小时。 Beta 发行版不在 boost/random 包中,所以我不得不使用 boost/math/distributions 包。我找到了 this page on StackOverflow其中提出了一个解决方案。这是(复制粘贴):

#include <boost/math/distributions.hpp> 
using namespace boost::math;  
double alpha, beta, randFromUnif;  
//parameters and the random value on (0,1) you drew  
beta_distribution<> dist(alpha, beta); 
double randFromDist = quantile(dist, randFromUnif); 

我复制了它并且成功了。我的模拟的运行时间估计是线性的并且可以准确预测。他们说这将运行 25 天。我看到两种可能性: 1. 建议的方法不如我之前用于其他发行版的方法 2. Beta 分布很难从中生成随机数

切记,我对 C++ 编码的了解不足,所以我问的问题可能很愚蠢。我等不及一个月才能完成此模拟,那么我可以做些什么来改进它吗?也许使用我使用的初始方法并修改它以使用 boost/math/distributions 包?我什至不知道这是否可能。

另一条可能有用的信息是,我需要生成的所有 (1,000,000)^2 个数字的参数都是相同的。我这么说是因为 Beta 分布确实有一个令人讨厌的 PDF,也许参数是固定的知识可以以某种方式用来简化过程?只是一个随机猜测。

最佳答案

beta 分布与 gamma 分布相关。设 X 是从 Gamma(α,1) 中抽取的随机数,Y 是从 Gamma(β,1) 中抽取的随机数,其中 Gamma 分布的第一个参数是形状参数。则 Z=X/(X+Y) 具有分布 Beta(α,β)。通过这种转换,它只需要您的 Gamma 分布测试时间的两倍。

注意:以上假定 Gamma 分布的最常见表示, Gamma (形状,尺度)。请注意, Gamma 分布随机生成器的不同实现会因参数的含义和顺序而异。

关于c++ - 来自 Beta 分布的随机数,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10358064/

相关文章:

c++ - 如何使用 std::vector 初始化 boost::random::discrete_distribution?

c++ - 窗口消息 : Different between WM_CREATE and WM_NCCREATE?

c++ - 在构造函数之后初始化 boost::asio 套接字

c++ - boost::random 和 boost:uniform_real 适用于 double 而不是 float ?

c++ - C++ boost::filesystem 如何检测路径是文件还是目录?

c++ - Boost SerialPort 的意外结果

c++ - 如何使用 boost::uniform_on_sphere?

c++ - 如何在没有子类化的情况下挂接特定的 Windows 消息?

c++ - 以下两个 C++ 类之间的区别是什么?

c++ - 使用 std::function 或转发引用作为高阶函数的通用可调用对象输入参数?