2012-08-12 61 views
0

我試圖用boost來生成隨機數,而且我很難讓它以一種封裝的方式工作。我有這片在main()的代碼,這允許我使用卷()來生成[0,1)隨機數生成和封裝

boost::mt19937 rng(seed); 
boost::uniform_01<> uniform_p; 
boost::variate_generator< boost::mt19937, boost::uniform_01<> > 
    roll(rng, uniform_p); 

一個隨機數,現在我想在自己的頭部,堅持這種/ cpp文件,其中一個函數用於獲取種子並創建卷軸,另一個函數用於調用卷軸。但似乎沒有任何東西能看到roll,而且我很確定在調用它的函數超出範圍之後它會超出範圍。我嘗試過使用static和extern,我試過讓一個類的roll部分,所以它不會超出範圍,但似乎沒有任何工作。

回答

0

以下是我喜歡用於生成隨機數的Matlab類接口。在使用rand()之前,您必須致電seed()。正如Greg指出的那樣,scoped_ptr可以方便地存儲所需的靜態變量(梅森扭轉器和變量生成器)。爲了線程安全,請使用互斥鎖保護這些資源。

random.hpp

#ifndef RANDOM_HPP 
#define RANDOM_HPP 

void seed(unsigned s); 
double rand(); 

#endif // RANDOM_HPP 

random.cpp

#include "random.hpp" 
#include <boost/random/mersenne_twister.hpp> 
#include <boost/random/uniform_01.hpp> 
#include <boost/random/variate_generator.hpp> 
#include <boost/scoped_ptr.hpp> 

static boost::scoped_ptr<boost::mt19937> twister; 
static boost::scoped_ptr<boost::variate_generator<boost::mt19937&, 
                boost::uniform_01<> > > vargen; 

void seed(unsigned s) 
{ 
    twister.reset(new boost::mt19937(s)); 
    vargen.reset(new boost::variate_generator<boost::mt19937&, 
               boost::uniform_01<> >(
        *twister, boost::uniform_01<>())); 
} 

double rand() 
{ 
    assert(vargen.get() != 0); 
    return (*vargen)(); 
} 

的main.cpp

#include "random.hpp" 
#include <iostream> 

int main() 
{ 
    seed(42); 
    for (int i = 0; i < 10; ++i) 
     std::cout << rand() << std::endl; 
    return 0; 
} 
+0

我想補充'static'關鍵字爲'twister'和'VA rgen',所以它們不會從目標文件中導出。絕對是在'rand()'中聲明'vargen.get()!= NULL'。 – Greg 2012-08-13 06:52:23

+0

@Greg:謝謝,它已更新。 – Mehrwolf 2012-08-13 07:52:49

1

如何在.h文件中聲明seedrool函數並在.cpp文件中實現它們。您可以使用static scoped_ptr來存儲幫助程序對象i .cpp模塊,並在靜態初始化階段後對其進行初始化。在這個解決方案中,線程安全是另一回事。