C++ Boost-Pareto分布随机生成的数

C++ Boost-Pareto分布随机生成的数,c++,boost,random,C++,Boost,Random,所以在问这个问题之前,我对stack overflow和google做了大量的调查。我有一个我正在进行的模拟,需要能够生成0到1.0之间的随机输入数据,这些数据遵循一定的统计分布 到目前为止,我已经得到了一个正态分布和一个均匀实分布,但我仍然坚持使用帕累托分布 前两个在boost/random/中可用,但pareto仅作为原始分布可用(即不可用于变量生成器)。有人知道生成所述随机数的方法吗?请注意,我已经详细介绍了boost文档,包括Pareto发行版。我希望生成遵循帕累托分布的随机数,而不是使

所以在问这个问题之前,我对stack overflow和google做了大量的调查。我有一个我正在进行的模拟,需要能够生成0到1.0之间的随机输入数据,这些数据遵循一定的统计分布

到目前为止,我已经得到了一个正态分布和一个均匀实分布,但我仍然坚持使用帕累托分布

前两个在boost/random/中可用,但pareto仅作为原始分布可用(即不可用于变量生成器)。有人知道生成所述随机数的方法吗?请注意,我已经详细介绍了boost文档,包括Pareto发行版。我希望生成遵循帕累托分布的随机数,而不是使用帕累托分布来确定统计概率。到目前为止,我唯一能想到的就是使用一个统一的生成器,并将这些值插入到帕累托分布的CDF中(但必须有比这更好的方法)

任何帮助都将不胜感激,因为我是新手

谢谢大家!

以下是我在前两个版本中使用的代码,以及一个变体生成器。这都是非常多的测试代码,所以请不要在风格或惯例上对我指手画脚:

#include <time.h>
#include <iostream>
#include <boost/random/normal_distribution.hpp>
#include <boost/random/uniform_real_distribution.hpp>
#include <boost/math/distributions/pareto.hpp>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/variate_generator.hpp>

int main(){
    boost::mt19937 randGen(time(0));

    boost::normal_distribution<> dist1(.5,.2);
    boost::random::uniform_real_distribution<> dist2(0.0,1.0);

    boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > generator1(randGen,dist1);
    boost::variate_generator<boost::mt19937&,boost::random::uniform_real_distribution<> > generator2(randGen,dist2);

    for(int x = 0; x < 10; x++)
        std::cout << generator1() << std::endl;

    std::cout << "\n\n\n";

    for(int x = 0; x < 10; x++)
        std::cout << generator2() << std::endl;

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
增压:mt19937兰登(时间(0));
boost::正态分布区1(.5,2);
boost::random::均匀实分布dist2(0.0,1.0);
boost::变量发生器发生器1(randGen,dist1);
boost::变量发生器发生器2(randGen,dist2);
对于(int x=0;x<10;x++)

std::cout因此,您可以使用boost生成服从指数分布的随机值,并从中手动计算帕累托分布值。您可能也感兴趣。

在做了更多的研究并咨询了统计部门的一些人之后,我发现了一种使用均匀实分布的方法最初尝试使用分位数函数,如后文所述,但总是得到1或0的字符串作为结果

经过一些额外的尝试和错误,我发现基本上你所需要做的就是将均匀实随机的结果插入cdf补码函数

Boost的有趣之处在于,它使用非成员函数来计算cdf值,因此cdf不是parteo分布本身的属性。相反,在Boost中实现这一点的正确方法是:

#include <boost/random/uniform_real_distribution.hpp>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/variate_generator.hpp>
#include <boost/math/distributions/pareto.hpp>

int main(){
     boost::mt19937 randGen(15); //held constant for repeatability
     boost:math::pareto_distribution<> dist;
     boost::random::uniform_real_distribution<> uniformReal(1.0,10.0); //this range can be adjusted to effect values

     boost::variate_generator<boost::mt19937&,boost::random::uniform_real_distribution<> > generator(randGen, dist);

     double cdfComplement;
     for(int i = 0; i < 5000; i++){
          cdfComplement = boost::math::cdf(complement(dist,generator()));
          //do something with value
     }         

     return 0;
}
#包括
#包括
#包括
#包括
int main(){
boost::mt19937 randGen(15);//保持恒定以实现重复性
数学:帕累托分布区;
boost::random::uniform_real_distribution uniformReal(1.0,10.0);//此范围可根据效果值进行调整
boost::变量_发生器(兰登区);
双CDF复合材料;
对于(int i=0;i<5000;i++){
cdfComplement=boost::math::cdf(补码(dist,generator());
//做有价值的事
}         
返回0;
}
到目前为止,我还没有找到将分布值限制在0.0到1.0范围内的好方法。有些异常值略低于0.0,有些则略高于1.0(尽管这完全取决于输入的实数范围)。您可以轻松地丢弃超出所需范围的值

我能够使用默认形状参数和上述方法实现这些结果。显示了5000个数据点:

但不知怎的,你错过了“推动帕累托分布”的第一个热门节目?一点也不。这并不能回答我的问题。这是如何使用帕累托分布根据分布确定概率。我需要生成遵循帕累托分布的随机数作为样本输入数据。在得出结论之前,请花时间理解问题的本质。@TylerS也许你是无法建立联系,评论人也没有意识到这一点。我也是,我认为这是“我找不到帕累托分布的实现”。一般来说,通过在问题中指出它,很容易抢占你预期的答案(“我知道boost实现了这里的统计分布,但我不确定如何将其应用于boost随机生成器”(好的观点。我编辑了正文,希望能让它更清楚。谢谢你的建议。