Boost C ++ - 生成0到1之间的随机实数

时间:2011-11-20 15:51:56

标签: c++ boost random

我一直在阅读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;
}

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

2 个答案:

答案 0 :(得分:2)

此代码中有一些问题:

  1. random01()函数不引用生成器,而是引用生成器的 copy 。因此,如果您使用相同的生成器多次调用该函数 - 它将反复生成相同的值!
  2. static中的uniform_01 random01()仅在第一次调用random01时被初始化,因此如果使用不同的生成器调用它,则不会使用它,而是使用它自第一个生成器的引用,甚至可能已被销毁!
  3. 正确就像是跟随(请注意参数列表中的&,传递引用,以及缺少static

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

答案 1 :(得分:0)

这是我找到的解决方案:

#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。

我将此作为“解决方案”发布,希望它可以帮助某人,但请批评任何您发现错误的内容。我尝试将播种步骤与实际生成分开,因此每次生成一个值时都不会播种。