C++ 一个引擎(boost::mt19937)多个分布(随机质量)
我正在使用boost_1_31_0,我正在尝试创建beta分布随机数(我正在使用beta(alpha,beta)=gamma(alpha)/(gamma(alpha)+gamma(beta))) 我每次用这个(见下文)创建16个随机数:问题是随机生成的不遵守大数定律:对于每个分布,当我计算生成数的平均值时,它与分布的平均值不同。结论是我们不能在很多发行版中使用相同的引擎吗? 我的代码如下:C++ 一个引擎(boost::mt19937)多个分布(随机质量),c++,C++,我正在使用boost_1_31_0,我正在尝试创建beta分布随机数(我正在使用beta(alpha,beta)=gamma(alpha)/(gamma(alpha)+gamma(beta))) 我每次用这个(见下文)创建16个随机数:问题是随机生成的不遵守大数定律:对于每个分布,当我计算生成数的平均值时,它与分布的平均值不同。结论是我们不能在很多发行版中使用相同的引擎吗? 我的代码如下: //this engine is created in the top of my code. boost
//this engine is created in the top of my code.
boost::mt19937 eng;
//MyVector.size() is equal to 8, this boucle is called 100 000 times
for (int i = 0; i<MyVector.size(); i++)
{
MyObject seedPtr = MyVector[i];
alpha = m_map_alpha.find(seedPtr)->second ;
boost::gamma_distribution<> gamma_alpha(alpha);
boost::variate_generator< boost::mt19937&,boost::gamma_distribution<>> generator_gamma_alpha(eng, gamma_alpha);
alpha_random = generator_gamma_alpha();
boost::gamma_distribution<> gamma_beta(beta);
boost::variate_generator< boost::mt19937&, boost::gamma_distribution<>> generator_gamma_beta(eng, gamma_beta);
beta_random = generator_gamma_beta();
random = alpha_random / (alpha_random + beta_random ) ;
pair<myObject, double> graine(seedPtr, random);
mapRandoms.insert(graine);
}
//此引擎是在我的代码顶部创建的。
增压:mt19937发动机;
//如果MyVector.size()等于8,则此边界被调用100000次
对于(int i=0;等秒;
boost::γ分布γα(α);
boost::variate_generatorgenerator_gamma_alpha(eng,gamma_alpha);
alpha_random=生成器_gamma_alpha();
boost::伽马分布伽马分布(beta);
boost::variate_generatorgenerator_gamma_beta(eng,gamma_beta);
beta_random=生成器_gamma_beta();
随机=阿尔法随机/(阿尔法随机+贝塔随机);
成对颗粒(种子,随机);
mapRandoms.insert(graine);
}
Boost 1.31.0?真的吗?1.50.0是当前版本。您在生成每个随机数后重新播种引擎,其输出不遵守分布规律(包括大数定律)我不会感到惊讶不,我只在代码顶部创建了一次,没有重新设定种子,因为我希望每次都有相同的随机数。我想我将使用boost::mt19937创建统一的随机数,并应用此算法创建gamma随机数:(gamma(S,1):if 01…)你知道gays使用分布boost::gamma_分布创建gamma随机数的算法是什么吗?事实上,你每次迭代都在重新播种rng。当你创建变量_生成器时,它会复制一个URNG,在你的循环中,它每一次都复制相同的rng状态