从升压Pareto分布随机生成的数字(Randomly Generated Numbers from

2019-10-22 07:15发布

所以,我没有环视堆栈溢出与谷歌相当数量的问这个问题之前。 我有我的工作的模拟和需要能够为0,并遵循一定的统计分布1.0之间产生随机输入数据。

到目前为止,我已经获得了正态分布和均匀分布的实际工作正常,但我坚持用帕累托分布。

前两种是在升压/无规/可用,但帕累托仅可作为原料分布(即未提供的变量发生器被使用)。 有谁知道的方式来产生所述随机数? 请注意,我已经倒在提升的文档,包括对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;
}

Answer 1:

帕累托分布与指数分布。 所以,你可以使用升压以产生遵循指数分布和手动从他们计算帕累托分布值的随机值。 这个问题也可能是因为对你的兴趣。



Answer 2:

在统计部门做一些更多的研究和咨询一些人后,我发现了一个办法做到这一点使用uniform_real分布。 我本来试图用位数的功能,如在此职位,但始终有1个或0的字符串作为我的结果。

经过一些额外的试验和错误,我发现,基本上所有你需要做的就是插上一致的结果真随机进入CDF补充功能。

升压是,它使用非成员函数来计算CDF值有意思,所以CDF不是parteo分布本身的属性。 相反,在升压做到这一点,正确的方法是:

#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;
}

还有,我发现,作为然而,到分配的值限制值完全相同的0.0〜1.0范围内,没有什么好办法。 有迹象表明,低于0.0稍微沾即走刚刚超过1.0(尽管这完全取决于你送入它的实数范围内)离群等。 您可以轻松地扔掉值你看的范围之外。

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



文章来源: Randomly Generated Numbers from Boost Pareto Distribution
标签: c++ boost random