【问题标题】:boost c++ is generating the same random number between 0 and 1, using the Mersenne Twister algorithm?boost c++ 使用 Mersenne Twister 算法在 0 和 1 之间生成相同的随机数?
【发布时间】:2023-03-07 22:33:01
【问题描述】:

我正在尝试使用 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 的重复,但是这个问题因为模棱两可而被关闭,所以我改写了它。

【问题讨论】:

  • 尝试将uniform_01 排除在循环之外

标签: c++ boost random


【解决方案1】:

这不是您使用发行版的方式。更像这样:

#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 不是分发的官方部分,但无论如何我最好使用更通用的uniform_real
  • @pythonscript: 好吧,只要你被锁定在 Boost 中就没有那么重要了,但是如果你最终想迁移到 std,那么养成正确的习惯是很好的! :-) &lt;random&gt; 接口自 TR1 和 Boost 以来经历了几次变化,因此值得一读。特别是,所有引擎现在都称为_engine,所有发行版都称为_distribution。哦,哎呀,我真的错了,让我改正!
  • 无论我是否使用#include &lt;random&gt;,您更新的代码都会在 Eclipse 中给我一个错误。我应该发布更多代码,还是坚持您建议的原始方式?如果可能的话,我想尽快学习最好的习惯。
  • @pythonscript:随便选哪个版本就行了。 C++11 说是 uniform_real_distribution,但 Boost 版本不同,&lt;tr1/random&gt; 版本也不同 - 只需检查您想要哪个并选择一个有效的 :-)
  • 这更有意义;在我做一个简单的项目之前,我将探索其他选项,然后再将自己牢牢地锁定在任何特定的库中。再次感谢您。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 2023-03-18
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    相关资源
    最近更新 更多