boost c++正在使用Mersenne Twister算法生成0到1之间的相同随机数

boost c++ is generating the same random number between 0 and 1, using the Mersenne Twister algorithm?

本文关键字:之间 随机数 c++ 算法 Twister Mersenne boost      更新时间:2023-10-16

我试图生成0和1之间的随机实数,使用Boost c++ uniform_01函数和Mersenne Twister算法。这是我的代码:

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

然而,这段代码在循环的每次迭代中生成相同的随机数。我知道这是在重复这个问题,但那个问题因为模棱两可而被关闭了,所以我重新措辞了一下。

这不完全是使用分布的方式。更像这样:

#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类,您可以使用类似的方法。

在函数外部创建uniform_01。您需要在同一个实例上工作以获得连续的数字。或者,您可以将其设置为静态