boost随机数库,对不同的变量生成器使用相同的随机数生成器

2024-04-16

似乎可以使用以下代码从特定的正态分布中生成随机数:

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 随机库的设计是否希望用户为每个分布创建一个随机数生成器?显然,我可以编写代码将均匀随机数序列转换为任意分布的序列,但我正在寻找简单且已内置于库中的东西。

在此先感谢您的帮助。


你的假设是正确的。你两者都想要variate_generator实例使用相同的随机数生成器实例。所以使用参考mt19937作为您的模板参数。

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

显然你必须确保randgen之前没有超出范围nD and nC do.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost随机数库,对不同的变量生成器使用相同的随机数生成器 的相关文章

随机推荐