2009-10-28 94 views
11

看来,可以使用下面的代码从一个特定的正态分布产生随机数:但是提高随机数库,使用相同的随机数发生器,用于不同的变量发电机

float mean = 0, variance = 1; 
boost::mt19937 randgen(static_cast<unsigned int>(std::time(0))); 
boost::normal_distribution<float> noise(mean, variance); 
variate_generator<mt19937, normal_distribution<float> > nD(randgen, noise); 

float random = nD(); 

这工作得很好,我希望能够从多个分布得出的数字,即人们会认为是这样的:

float mean1 = 0, variance1 = 1, mean2 = 10, variance2 = 0.25; 
boost::mt19937 randgen(static_cast<unsigned int>(std::time(0))); 
boost::normal_distribution<float> noise1(mean1, variance1); 
boost::normal_distribution<float> noise2(mean2, variance2); 
variate_generator<mt19937, normal_distribution<float> > nD(randgen, noise1); 
variate_generator<mt19937, normal_distribution<float> > nC(randgen, noise2); 

float random1 = nD(); 
float random2 = nC(); 

然而,问题似乎是ND()和NC()正在生成的数字相似的序列。我假设这是因为variate_generator的构造函数看起来是作为randgen的副本,而不是明确地使用它。因此,正在生成相同的伪随机序列,并简单地通过不同的转换(由于分布的不同参数)。

有谁知道在Boost中是否有办法创建一个随机数生成器并将其用于多个分布?或者,Boost随机库的设计是否让用户为每个分配创建一个随机数生成器?显然,我可以编写代码来将一系列统一的随机数字转换为任意分布的序列,但是我正在寻找一些简单的内置于图书馆的内容。

在此先感谢您的帮助。

回答

11

你的假设是正确的。您希望两个variate_generator实例使用相同的随机数生成器实例。因此请使用对mt19937的引用作为模板参数。

variate_generator<mt19937 &, normal_distribution<float> > nD(randgen, noise1); 
variate_generator<mt19937 &, normal_distribution<float> > nC(randgen, noise2); 

很明显,你就必须确保randgennDnC做之前不出去的范围。

+0

这似乎是完美的工作。是否使第一个模板参数只是将随机数生成器的内部存储器更改为参考?谢谢。 – RandomGuy 2009-10-29 14:56:12

+1

是的。变量生成器类是(相对)简单的。最初的实例化类有一个'mt19937'类型的成员变量。正确的一个,有一个成员变量来键入'mt19937&'。没有发生其他更改。 – AFoglia 2009-10-29 21:29:29

+1

使用对mt19937的引用会使variate generator不可分配;如果你需要赋值,你可以使用指针类型。即variate_generator > nD(...); – 2012-11-11 16:30:33