2011-03-10 50 views
1

在我正在寫的一個模擬中,我有一個代表必須採取某些操作的代理的類,並且我希望此代理可以訪問隨機數生成器。我聽到了提升rng的好處,所以我想學習如何使用它們。提升隨機數 - 奇怪的編譯錯誤

所以,這是問題所在。此代碼編譯並運行完美:所以

//Random.cpp 
#include <boost/random.hpp>  
#include <boost/limits.hpp> 
#include <iostream> 
#include <ctime>   


int main() 
{ 
    int N = 10; 
    boost::lagged_fibonacci607 rng; 
    rng.seed(static_cast<boost::uint32_t> (std::time(0))); 
    boost::uniform_real<> uni(0.0,1.0); 
    boost::variate_generator<boost::lagged_fibonacci607&, boost::uniform_real<> > uniRng(rng, uni); 

    for (int i = 0; i < N; ++i) 
     std::cout << uniRng() << std::endl; 

    return 0; 

} 

,我希望我的代理類,以便獲得具有類型的私有對象:

boost::variate_generator<boost::lagged_fibonacci607&, boost::uniform_real<> > 

,可以當代理需要一個隨機數被稱爲。

所以我試圖做的是:

//RandomAgent.cpp  
#include <boost/random.hpp>  
#include <boost/limits.hpp> 
#include <iostream> 
#include <ctime>   

class Agent { 
private: 
    boost::lagged_fibonacci607 rng; 
    boost::uniform_real<> uni(0.0,1.0); 
    boost::variate_generator<boost::lagged_fibonacci607&, boost::uniform_real<> > uniRng(rng, uni); 

public: 
    Agent() { 
    rng.seed(static_cast<boost::uint32_t> (std::time(0))); 
    } 
    void show() { 
    std::cout << uniRng() << std::endl; 
    } 
}; 


int main() { 
    Agent foo; 
    for(int i = 0; i < 10; ++i) 
    foo.show() 
} 

而且我得到了以下錯誤消息:

$ g++ RandomAgent.cpp 
Random.cpp:10: error: expected identifier before numeric constant 
Random.cpp:10: error: expected ‘,’ or ‘...’ before numeric constant 
Random.cpp:11: error: ‘rng’ is not a type 
Random.cpp:11: error: ‘uni’ is not a type 
Random.cpp: In member function ‘void Agent::show()’: 
Random.cpp:18: error: no matching function for call to ‘Agent::uniRng()’ 
Random.cpp:11: note: candidates are: boost::variate_generator<boost::lagged_fibonacci607&, boost::uniform_real 

>代理:: uniRng(INT,INT)

回答

3

我想您需要在構造函數初始化列表中初始化成員變量uniuniRng,而不是內聯聲明它們的位置。

+1

哦......當然! !該死的。在我發佈之前,我應該閱讀我的代碼。 :P – 2011-03-10 14:54:16

2

這兩條線:

boost::uniform_real<> uni(0.0,1.0); 
boost::variate_generator<boost::lagged_fibonacci607&, boost::uniform_real<> > uniRng(rng, uni); 

應該

boost::uniform_real<> uni; 
boost::variate_generator<boost::lagged_fibonacci607&, boost::uniform_real<> > uniRng; 

和這兩個變量在構造函數初始化,如

Agent() 
    : uni(0., 1.), uniRng(rng, uni) 
{ 
    rng.seed(static_cast<boost::uint32_t> (std::time(0))); 
}