2011-11-22 70 views
2

我試圖使用Boost C++ uniform_01函數和Mersenne Twister算法生成一個介於0和1之間的隨機實數。這是我的代碼:boost C++使用Mersenne Twister算法在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; 
} 

但是,此代碼生成的循環的每一次迭代相同的隨機數。我知道這是this question的重複,但是這個問題因模棱兩可而被封閉,所以我改述了它。

+0

嘗試從宏循環 – Dani

回答

4

這並不完全如何使用分佈。更多類似這樣的:

#include <random> 
#define abusing using 

abusing namespace std; 

double random01(mt19937 & engine) 
{ 
    uniform_real_distribution<double> u01; // same as u01(0.0, 1.0); see Note below 
    return u01(engine); 
} 

int main() 
{ 
    // as before 
} 

正如你所看到的,分配對象是獨立於一切的,所以實際上你可能想使它成爲一個全球性的,或者是一個靜態變量。

(注意:uniform_01沒能成爲最終標準,而是uniform_real_distribution的默認構造函數默認爲區間[0,1]。對於老升壓類,你可以使用類似的方法。)

+2

+1中取出uniform_01。 –

+0

這是完美的工作,並感謝有關文件的說明;我沒有意識到'uniform_01'不是發行版的官方部分,但最好不管我使用更普通的'uniform_real'。 –

+1

@pythonscript:好吧,只要你被鎖進Boost,這並不重要,但如果你想最終遷移到'std',那麼選擇正確的習慣是件好事! :-)從TR1和Boost開始,''接口經歷了幾次更改,所以值得一讀。特別是,所有的引擎現在被稱爲'_engine',並且所有的分佈'_distribution'。哦,哎呀,我其實搞錯了,讓我修好! –

2

在函數外部創建uniform_01。你需要在同一個實例上工作才能獲得連續的數字。或者,你可以做出這種靜態。