C++ TR1:如何使用normal_distribution?
-
12-09-2019 - |
题
我正在尝试使用 C++ STD 技术报告1 扩展来生成遵循正态分布的数字,但是此代码(改编自 本文):
mt19937 eng;
eng.seed(SEED);
normal_distribution<double> dist;
// XXX if I use the one below it exits the for loop
// uniform_int<int> dist(1, 52);
for (unsigned int i = 0; i < 1000; ++i) {
cout << "Generating " << i << "-th value" << endl;
cout << dist(eng) << endl;
}
只打印 1 条“正在生成...”日志消息,然后 永远不会退出 for 循环!如果我使用我注释掉的发行版,它就会终止,所以我想知道我做错了什么。任何想法?
多谢!
解决方案
这绝对不会挂起该程序。但是,不知道它是否真的符合您的需求。
#include <random>
#include <iostream>
using namespace std;
typedef std::tr1::ranlux64_base_01 Myeng;
typedef std::tr1::normal_distribution<double> Mydist;
int main()
{
Myeng eng;
eng.seed(1000);
Mydist dist(1,10);
dist.reset(); // discard any cached values
for (int i = 0; i < 10; i++)
{
std::cout << "a random value == " << (int)dist(eng) << std::endl;
}
return (0);
}
其他提示
我曾与最初发布的代码相同的问题,并研究了GNU实施
第一一些意见: 使用g ++ - 4.4以及使用该代码挂起, 使用g ++ - 4.5和使用-std =的C ++ 0x(即,不是TR1但真实的东西)上面的代码的工作原理强>
IMHO,有关于随机数生成和随机数的消耗之间的适配器TR1和的C ++ 0x之间的变化 - mt19937生成一个整数,normal_distribution消耗双打
的的C ++ 0x使用自适应自动,则克++ TR1代码不
,以获得代码使用g ++工作 - 4.4和TR1,执行以下操作
std::tr1::mt19937 prng(seed);
std::tr1::normal_distribution<double> normal;
std::tr1::variate_generator<std::tr1::mt19937, std::tr1::normal_distribution<double> > randn(prng,normal);
double r = randn();
如果您的TR1随机数生成的实现是越野车,您可以通过编写自己的正常生成如下避免TR1。
产生两个均匀的(0,1)随机样本u和v使用您信任任何随机发生器。然后令r = SQRT(-2日志(U))和返回X = R罪(2πv)中。 (这就是所谓的箱型的Mueller方法。)
如果您需要平均值为mu和标准偏差西格玛正常样品样品,返回西格玛* X +亩,而不是仅仅X
虽然这似乎是一个错误,的快速确认。将通过缺省0.0,1.0参数。 normal_distribution<double>::normal_distribution()
应该等于normal_distribution<double>::normal_distribution(0.0, 1.0)