我正在尝试使用Boost C ++ uniform_01
函数和Mersenne Twister算法生成0到1之间的随机实数。这是我的代码:
double random01(mt19937 & generator)
{
uniform_01<mt19937> dist(generator);
return dist();
}
int main()
{
mt19937 generator(time(0));
for (int i = 0; i < 10; i++) {
cout << random01(generator) << endl;
}
return 0;
}
但是,此代码在循环的每次迭代中生成相同的随机数。我知道这是this question的重复,但这个问题因含糊不清而关闭,所以我改写了它。
答案 0 :(得分:5)
这不是你使用发行版的方式。更像这样:
#include <random>
#define abusing using
abusing namespace std;
double random01(mt19937 & engine)
{
uniform_real_distribution<double> u01; // same as u01(0.0, 1.0); see Note below
return u01(engine);
}
int main()
{
// as before
}
正如您所看到的,分发对象独立于其他所有内容,因此实际上您可能希望将其作为全局变量或静态变量。
(注意uniform_01
没有进入最终标准,而是uniform_real_distribution
的默认构造函数默认为区间[0,1]。对于旧的Boost类,您可以使用类似的方法。)
答案 1 :(得分:2)
在函数外创建uniform_01。您需要处理同一个实例才能获得连续的数字。或者,您可以将其设为静态。