2014-01-30 67 views
0

這是我第一次在這裏發佈的東西,所以請善待:)以自己的班級方法助推隨機發生器

這是我的問題。

我想用提高隨機數發生器,因爲它是在這個例子中http://www.boost.org/doc/libs/1_46_1/libs/random/example/random_demo.cpp

的例子作品在我的電腦上完全正常進行,唯一的問題是,當我在我創建了一個類中使用它,輸出都是一樣的,我不明白爲什麼,因爲他們不在這個例子。該類的名稱稱爲Edge,並有兩個私人成員,即A點,B點(經典示例類)。所以你可以看到一個「邊緣」作爲一個端點A和B的段。我的目標是在這個段上繪製一個隨機點。

所以,當我做

int main(){ 
    Edge test; 
    for (int i=0;i<10;i++) 
     std::cout << test.draw_a_double() << endl; 
    return 0; 
    } 

它總是返回相同的編號:(

這裏是.h文件的方法:

double draw_a_Point(); 

這裏是「#包括「在.cpp文件中(我應該把它們放在.h文件中,因爲我沒有在我的項目的所有文件中使用它們):

#include <ctime> 
#include <boost/random/mersenne_twister.hpp> 
#include <boost/random/uniform_real.hpp> 
#include <boost/random/variate_generator.hpp> 

typedef boost::mt19937 base_generator_type; 

這裏是我的方法的代碼:

base_generator_type generator(42u); 
generator.seed(static_cast<unsigned int>(std::time(0))); 
boost::uniform_real<> uni_dist(0,1); 
boost::variate_generator<base_generator_type&, boost::uniform_real<> > uni(generator, uni_dist); 

double diffChosen=uni(); 
return diffChosen; 

我因爲主要和唯一的問題來自於一個事實,即diffChosen是永遠不變的這裏不歸路對象。

這個問題是出自只有在主函數中隨機數發生器工作的事實嗎?

謝謝

+0

將'generator'移到函數之外,並且只播種一次。 – Jarod42

回答

1

以下可能會有所幫助:

double Edge::draw_a_double(base_generator_type& generator) 
{ 
    boost::uniform_real<> uni_dist(0,1); 
    boost::variate_generator<base_generator_type&, boost::uniform_real<> > uni(generator, uni_dist); 

    double diffChosen = uni(); 
    return diffChosen; 
} 

int main() 
{ 
    base_generator_type generator(42u); 
    generator.seed(static_cast<unsigned int>(std::time(0))); 

    Edge test; 
    for (int i = 0; i < 10; i++) { 
     std::cout << test.draw_a_double(generator) << std::endl; 
    } 
    return 0; 
} 

的,爲什麼你的代碼失敗說明:

generator有一個內部狀態產生數。 由seed初始化。 返回一個新的隨機數後,其狀態發生變化。

但是你每次重置其狀態:

generator.seed(static_cast<unsigned int>(std::time(0))); 

std::time(0)改變每一秒...... 所以,你得到的隨機數序列的相同的​​第一個號碼。