【问题标题】:Boost C++ - generating a random real number between 0 and 1 [closed]Boost C++ - 生成0到1之间的随机实数[关闭]
【发布时间】:2011-11-20 15:51:55
【问题描述】:

我一直在阅读 Boost C++ 文档并试图弄清楚如何使用库的 uniform_01 部分生成介于 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;
}

对不起,如果我不清楚;我的回答或任何其他问题都没有解决这个问题。它仍然每次都生成相同的随机值。

【问题讨论】:

  • 如果这是一个自我回答,您应该先将其作为问题发布。该解决方案应该稍后作为答案发布。
  • 最好改写成一个问题“如何生成0到1之间的随机实数”,下面有答案。
  • 会的;谢谢你。我还有什么需要做的吗?
  • 最后一件事:将您的答案标记为已接受。
  • 两天内我无法接受自己的答案,但我会尽快接受。

标签: c++ boost random


【解决方案1】:

这段代码中有一些“陷阱”:

  1. random01() 函数不引用生成器,而是生成器的副本。因此,如果您使用同一个生成器多次调用该函数 - 它会一遍又一遍地产生相同的值!
  2. random01() 中的 static uniform_01 仅在第一次调用 random01 时被初始化,因此如果使用不同的生成器调用它,它不会使用它,而是使用对第一个生成器的引用,甚至可能已经被销毁!

正确的内容类似于以下内容(注意参数列表中的&amp;,用于传递引用,并且缺少static

double random01(mt19937 & generator)
{
    uniform_01<mt19937> dist(generator);
    return dist();
}

【讨论】:

  • 感谢您的帮助;当我使用该代码在循环中生成一系列值时,每次生成的值都是相同的。我无法在评论中正确发布代码,但我只是将 cout 语句包装在 for 循环中。
【解决方案2】:

这是我找到的解决方案:

#include <iostream>
#include <ctime>
#include <boost/random.hpp>

using std::cout;
using std::endl;

using boost::mt19937;
using boost::uniform_01;

double random01(mt19937 generator)
{
    static uniform_01<mt19937> dist(generator);
    return dist();
}

int main()
{
    mt19937 generator(time(0));
    cout << random01(generator) << endl;

}

代码由here稍作修改;向 Bojan Nikolic 致敬。

我将此作为“解决方案”发布,希望它可以帮助某人,但请批评您发现的任何错误。我试图将播种步骤与实际生成分开,这样捻线机就不会在每次生成值时都播种。

【讨论】:

  • 如果你有 c++11,你可以使用 c++11 stl 而不是 boost
  • 对。我使用的 Linux 版本默认不使用 g++ 4.6(我认为这是对 c++11 有很多支持的编译器),我试图避免从源代码编译 g++。
  • Ubuntu 11.04 x64。根据 apt,它在存储库中的版本是 4.5.2。我不确定它是否支持 C++11,直到今天下午我才知道 C++11 中的随机数函数;我以后可能会调查这些。
  • 在我的 Ubuntu 上我总是编译 gcc,在 Ubuntu 上真的很简单
  • 这是我听说的;我昨天才开始使用 C++,所以还没有必要。我可能会在今天晚些时候试一试。
猜你喜欢
  • 2012-02-27
  • 2014-04-11
  • 1970-01-01
  • 2013-07-31
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
相关资源
最近更新 更多