我正在尝试使用 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)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top