增强C++;-生成0到1之间的随机实数 我一直在阅读Boost C++文档,试图找出如何在0到1之间生成一个随机实数,使用 Simuly01 0/COD>部分库。有人有什么建议吗

增强C++;-生成0到1之间的随机实数 我一直在阅读Boost C++文档,试图找出如何在0到1之间生成一个随机实数,使用 Simuly01 0/COD>部分库。有人有什么建议吗,c++,boost,random,C++,Boost,Random,根据建议,我正在使用这段代码,但每次都会生成相同的随机值 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 << rand

根据建议,我正在使用这段代码,但每次都会生成相同的随机值

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;
}
double random01(mt19937和发电机)
{
均匀_01距离(发生器);
返回距离();
}
int main()
{
mt19937发电机(时间(0));
对于(int i=0;i<10;i++){

cout这就是我找到的解决方案:

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

}
#包括
#包括
#包括
使用std::cout;
使用std::endl;
使用boost::mt19937;
使用boost::uniform_01;
双随机01(mt19937发电机)
{
静态均匀分布(发生器);
返回距离();
}
int main()
{
mt19937发电机(时间(0));

cout在这段代码中有几个“gotcha”:

  • random01()
    函数不引用生成器,而是引用生成器的副本。因此,如果使用同一个生成器多次调用该函数,它将一次又一次地生成相同的值
  • random01()
    中的
    static
    uniform\u 01
    仅在第一次调用random01时初始化,因此,如果使用其他生成器调用它,它将不使用它,而是使用对第一个生成器的引用,该生成器甚至可能已被销毁,因为
  • 正确的方法如下所示(注意参数列表中的
    &
    ,用于传递引用,以及缺少
    静态

    double random01(mt19937 & generator)
    {
        uniform_01<mt19937> dist(generator);
        return dist();
    }
    
    double random01(mt19937和发电机)
    {
    均匀_01距离(发生器);
    返回距离();
    }
    
    如果这是一个自我回答,您应该先将其作为问题发布。然后,此解决方案应该作为答案发布。最好将其重写为一个问题“如何生成0到1之间的随机实数”,和下面的答案。可以;谢谢。还有什么我需要做的吗?最后一件事:将你的答案标记为已接受。我不能接受我自己的答案两天,但我会尽快接受。如果你有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,这非常容易UBtutui,我听说了,我昨天刚开始用C++,所以我还没有必要。今天我可能会给你一个运行。谢谢你的帮助,当我用这个代码在一个循环中生成一系列的值时,每次生成的值都是一样的。我不能在注释中正确地发布代码,但是我只是把<代码>打包了。cout
    语句位于for循环中。