来自Beta发行版的随机数,C ++

时间:2012-04-27 21:23:54

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

我在C ++中编写了一个模拟,它从特定的概率分布中生成(1,000,000)^ 2个数字,然后用它们做一些事情。到目前为止,我使用了指数,正常,伽玛,均匀和泊松分布。以下是其中一个的代码:

#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,也许参数修复的知识可以某种方式用于简化过程?只是随机猜测。

3 个答案:

答案 0 :(得分:5)

β分布与伽玛分布有关。设X是从Gamma(α,1)绘制的随机数和从Gamma(β,1)绘制的Y,其中伽马分布的第一个参数是形状参数。然后Z = X /(X + Y)具有分布β(α,β)。通过这种转换,它只需要花费两倍于伽玛分布测试的时间。

注意:上面假设了伽玛分布的最常见表示,Gamma(形状,比例)。请注意,伽马分布随机生成器的不同实现将随参数的含义和顺序而变化。

答案 1 :(得分:2)

如果你想要一个类似Beta的发行版,但有一个非常简单的封闭形式反向CDF,那么值得考虑Kumaraswamy发行版:

http://en.wikipedia.org/wiki/Kumaraswamy_distribution

当快速需要大量随机样本时,它可用作Beta版本的替代品。

答案 2 :(得分:0)

尝试使用优化进行编译。使用标志-O3通常会加快速度。有关详细信息,请参阅此post on optimisation flagsthis overview