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

标签 c++ boost random

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

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);

显然,在 nDnC 超出范围之前,您必须确保 randgen 不超出范围。

关于c++ - boost 随机数库,对不同的变量生成器使用相同的随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1638237/

相关文章:

c++ - 从文件 [C++] 中读取矩阵数据及其维度

c++ - 如何在 Mac OS X C++ 程序中记录时间戳?

c++ - boost 将 unordered_map 保存到磁盘的能力

c++ - 是否可以将多态类存储在共享内存中?

multithreading - 具有信号量和伪随机数的概念多线程

r - 如何在列表的每一行中随机选择行和列

c++ - 'default' 作为变量名

c++ - 使用函数返回初始化列表中的临时值是否合法

c++ - 使用 C++11 占位符作为 lambdas?

random - 在 JMeter 的 JSR223 采样器中生成随机值