C++ C++;TR1:如何使用正态分布?

C++ C++;TR1:如何使用正态分布?,c++,tr1,normal-distribution,C++,Tr1,Normal Distribution,我试图使用C++STD TechnicalReport1扩展来生成服从正态分布的数字,但这段代码(改编自): mt19937英语; 种子; 正态分布区; //XXX如果我使用下面的一个,它将退出for循环 //统一区(1,52); for(无符号整数i=0;i

我试图使用C++STD TechnicalReport1扩展来生成服从正态分布的数字,但这段代码(改编自):

mt19937英语;
种子;
正态分布区;
//XXX如果我使用下面的一个,它将退出for循环
//统一区(1,52);
for(无符号整数i=0;i<1000;++i){

cout虽然这似乎是一个bug,但快速确认是传递默认的0.0、1.0参数。
正态分布::正态分布()
应该等于
正态分布::正态分布(0.0,1.0)
这肯定不会挂起程序。但是,不确定它是否真的满足您的需要

 #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); 
 }
#包括
#包括
使用名称空间std;
typedef std::tr1::ranlux64_base_01 Myeng;
typedef std::tr1::正态分布Mydist;
int main()
{ 
英明;
工程种子(1000);
Mydist(1,10);
dist.reset();//放弃任何缓存的值
对于(int i=0;i<10;i++)
{

如果您的TR1随机数生成实现有缺陷,您可以通过编写自己的普通生成器来避免TR1,如下所示

使用您信任的任意随机生成器生成两个均匀(0,1)的随机样本u和v。然后让r=sqrt(-2 log(u))并返回x=r sin(2 pi v)。(这称为Box-Mueller方法。)


如果您需要具有平均μ和标准偏差σ的正常样本,请返回σ*x+mu,而不仅仅是x。

我对最初发布的代码有相同的问题,并调查了的GNU实现

首先是一些观察: 使用g++-4.4并使用代码挂起, 使用g++-4.5并使用-std=c++0x(即不是TR1而是真实的东西)以上代码可以工作

在随机数生成和随机数消耗之间的适配器方面,TR1和c++0x之间发生了变化——mt19937生成整数,正态分布消耗双倍

c++0x自动使用自适应,而g++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();
std::tr1::mt19937 prng(种子);
std::tr1::正态分布正态分布;
标准::tr1::变量发生器randn(prng,正常);
双r=randn();

它也不起作用,它仍然无法执行第一次计算..谢谢,它工作起来很有魅力,但我想知道为什么这个引擎可以工作,而另一个引擎不行..显然唯一的区别是你使用的是mt19937数字生成器,而Jagannath使用的是std::tr1::ranlux64_base_01。逻辑上,我猜错误可能存在于mt19937对象的实现中(algo,我在您之前从未听说过,thx表示:-))这不是std库的一部分。在绘制随机数时,有可能对这样一个for循环进行矢量化吗?我记得你不能对一个有函数调用的循环进行矢量化。只是尝试了一下。它运行得非常快——用1M个样本进行了测试,它为1-sigma、2-sigma等范围内的样本提供了几乎完美的统计数据。
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();