2013-01-10 33 views
0

我使用的是uniform_int_distribution在升壓1.52生成使用基本樣板代碼的隨機數:如何在標準構造函數之外設置boost :: uniform_int_distribution的參數?

#include <boost/random/mersenne_twister.hpp> 
#include <boost/random/uniform_int_distribution.hpp> 

boost::random::mt19937 gen; 

int roll_die() 
{ 
    boost::random::uniform_int_distribution<> dist(1, 6); 
    return dist(gen); 
} 

int main() 
{ 
    for (int i = 0; i < 10; i++) std::cout << roll_die() << std::endl;  
} 

我實現了這部分在一個更大的項目和它的偉大工程。這是我的問題。

在上面的函數中,似乎dist對象是函數的本地對象。如果你多次調用roll_die(),看起來像dist()是本地函數會帶來很多開銷。

我在想,最好設置這個對象的最小和最大參數一次,然後在一個更大的對象中只有一個dist實例或其他東西。如何做到這一點?我試圖理解類模板的「Public Member Functions」部分:http://www.boost.org/doc/libs/1_47_0/doc/html/boost/random/uniform_int_distribution.html#id744736-bb,但它已經過去了。在那個文檔中我看到:

void param(const param_type & param); //Sets the parameters of the distribution. 

你怎麼實際使用它? .param()本身是一個調用的函數,還是它是另一個函數的替身?我無法找到另一個提升我做的問題的例子。預先感謝您的幫助和建議!

+1

「均勻分佈」類只有兩個整數數據成員,所有構造函數都會分配它們的值。使用全局對象並每次設置值都可能產生接近相同的代碼。 –

回答

3

看起來好像會引入很多開銷。

您可能會認爲它確實如此,但您是否確實知道這一點?如果沒有實際運行探查器或以其他方式對代碼進行基準測試,則不應做出任何假設。如果你看看源代碼,你可以看到uniform_int_distribution的構造函數只是分配最小值和最大值 - 這應該是非常小的開銷。特別是如果考慮到實際的隨機數生成將比兩個任務更復雜。所以我建議你保持原樣,如果你的程序太慢,你總是可以進行配置然後優化。

編輯:引用Djikstra:「過早優化是萬惡之源」。通常情況下,程序員編寫比需要更復雜的代碼,只是因爲他們認爲它會更快。不要這麼做 - 只有在出現速度問題時纔開始優化。

無論如何,要回答您的問題:param()uniform_int_distribution的成員。它需要uniform_int_distribution::param_type類型的對象。您可以使用它像這樣:

using namespace boost::random; 

// Create an uniform_int_distribution object 
uniform_int_distribution<> dist(1, 6); 

// Create a params object 
uniform_int_distribution::param_type newParams(10, 500); 

// The following will reconfigure dist to have 10 and 500 as 
// min and max value 
dist.param(newParams); 

這種方式,你可以經常只要你喜歡重新配置一個分佈對象。但是「開銷」可能與構建新的分發對象相同。

的另一種方法,你可以確保對象只創建一次:

int roll_die() 
{ 
    static boost::random::uniform_int_distribution<> dist(1, 6); 
    return dist(gen); 
} 

聲明的內部函數的變量爲靜態也有類似的效果,如果變量,其中全球性的,但它只是在函數的範圍可見。

+0

真棒答案 - 無論是在向我展示我應該配置以確保,並告訴我如何使用params對象。非常感謝! – Joe

+0

不客氣:) –

相關問題