2013-04-27 53 views
3

最近,我正在寫一個基於策略類利用C++ 11的隨機數設施的。我希望能夠將stdlib隨機分佈作爲策略傳遞給我的類(特別是作爲模板模板參數)。爲了達到這個目的,我當然可以創建自己的RandomPolicy類包裝器。但我懷疑我在做什麼是錯的。爲什麼隨機分佈不會將引擎作爲模板參數?

也就是說,它提出了以下問題:爲什麼不隨機分佈取發動機類型作爲模板參數?相反,我發現引擎將一個分佈作爲operator()的參數(而不是作爲模板參數)。 在代碼中,你可以這樣寫:

std::default_random_engine engine; 
std::uniform_int_distribution<int> distribution(0, 9); 
int n = distribution(engine); 

在代碼中,我本來希望能夠寫:

當然,分佈則因而也必須採取種子爲一個參數(對其構造函數)。 當然,我在這裏忘記了一些問題/限制。 所以我想知道具體的原因是什麼,不把它作爲模板參數。

我懷疑這可能是因爲發行版不應該處理引擎的構建,但畢竟這不太可能,因爲引擎的構造函數除了種子(將被傳遞給發行版)。

回答

3

我能想到的兩個原因:

  1. 你暗示是:發動機可能需要任意參數給它的構造,且分佈不知道如何建立它。大多數(所有?)標準引擎只取一顆種子並不意味着沒有其他參數。您甚至可以使用任意構造函數參數構建自己的引擎。
  2. 一個單發動機對象可以與許多不同的分佈來使用。其實我會說這是使用它的首選方式:只需構建一個引擎和多個發行版。不得不建造幾個發動機並將它們全部種下來的選擇可能有點麻煩。

它實際上是一種依賴注入的形式

+0

啊,謝謝。我不知道你可以自由地讓引擎接受的不僅僅是種子參數。接受答案:)。 – Aleph 2013-04-27 20:23:59

+0

它是否定義了爲了與標準分佈一起使用而需要放入課堂的內容?我知道它叫'操作符()'來獲取值,但有更多的東西需要使用 – Xymostech 2013-04-27 20:31:34

+0

@Xymostech(或者甚至在標準中規定的?):是的,他們被稱爲_Uniform隨機數發生器requirements_ 。基本上它們是:1)typedef'result_type'(無符號整數); 2)'result_type operator()'; 3)'result_type min()'; 4)'result_type max()'。此外:'分鐘()'和'MAX()'是常數,'分鐘() rodrigo 2013-04-27 21:16:08

相關問題