生成0到1之间的随机实数



我一直在阅读Boost c++文档,并试图找出如何生成0和1之间的随机实数,使用库的uniform_01部分。有人有什么建议吗?

根据建议,我使用这段代码,但它每次生成相同的随机值。

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

抱歉,如果我没有说清楚;这个问题解决不了,不管是我的答案还是其他人的答案。它每次仍然生成相同的随机值

这段代码中有几个'gotcha':

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

正确的是如下所示(注意参数列表中的&,用于引用传递,并且缺少static:

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

这是我找到的解决方案:

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

代码从这里稍微修改;向博扬·尼科利奇致敬。

我把这个作为一个"解决方案",希望它能帮助别人,但请批评任何你注意到的错误。我试图将播种步骤与实际生成分开,这样龙卷风就不会在每次生成值时都播种。

最新更新