2011-11-20 153 views
1

我一直在阅读Boost C++文档,并试图找出如何使用库的uniform_01部分生成0到1之间的随机实数。有没有人有什么建议?Boost C++ - 生成一个介于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

如果这是一个自我的答案,你应该首先发布它作为一个问题,然后这个解决方案应该稍后作为答案张贴 – Bart

+0

更好地将其重写为“如何生成0到1之间的随机实数”以及下面的答案 –

+0

会做什么;谢谢,还有什么我需要做的吗? –

回答

2

有几个“疑难杂症在此代码:

  1. random01()功能并不需要到发电机的引用,而是复制发电机。所以如果你用相同的发生器多次调用函数 - 它会一遍又一遍地产生相同的值!
  2. staticuniform_01random01()仅被初始化的第一次调用random01,所以如果是以往任何时候都具有不同的生成方法,它将不使用它,而是用一个参照第一发生器,它甚至可能已经自毁!

正确会像下面(注意在参数列表中的&,对于传引用,而缺乏static

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

谢谢你的帮助;当我使用该代码在循环中生成一系列值时,每次生成的值都是相同的。我无法在评论中正确发布代码,但我只是将'cout'语句包装在for循环中。 –

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。

我发布这个作为“解决方案”,希望它可以帮助某人,但请批评你发现任何错误的东西。我尝试将播种步骤与实际生产环节分开,以免扭转器每一次都会产生一个值。

+0

如果你有C++ 11 – Dani

+0

对,你可以用C++ 11 stl而不是boost来完成。我使用的Linux版本默认情况下不使用g ++ 4.6(我认为这是对C++ 11支持很多的编译器),我试图避免从源代码编译g ++。 –

+0

它是什么linux? – Dani

相关问题