2011-11-20 98 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

相關問題