2013-07-26 64 views
7

生成隨機數的C++ 11的方法是:什麼類型的隨機數引擎用於指定的隨機分佈?

  1. 實例化的隨機數引擎
  2. 實例化一個隨機分佈
  3. 推送來自發動機的隨機數通過分配

問題是,隨機數引擎隨機分佈是關於arit類型的模板你正在使用的噴頭。

這兩種類型的算術有什麼關係?

您可以使用該引擎爲分佈和對面一個32位整數和一個64位整數?有什麼危險? 浮點類型呢?

我假設一個指引,即引擎生成的可能數字的數量應該大於或等於您希望獲得的不同隨機數的數量。不幸的是,我無法測試我的假設,因爲在我的電腦uint_fast32_tuint_fast64_t是相同的,因此三個C++ 11發電機的每一個的建議引擎產生相同的結果。

上C++ 11個分佈像std::uniform_real_distributionstd::uniform_int_distribution該文檔是在這方面不完全:

這部分是不完整的。 原因:在發電機

但exapmple的gcc 4.7實施uniform_real_distribution要求是:

template<typename _UniformRandomNumberGenerator> 
result_type 
operator()(_UniformRandomNumberGenerator& __urng, 
     const param_type& __p) 
{ 
    __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> 
    __aurng(__urng); 
    return (__aurng() * (__p.b() - __p.a())) + __p.a(); 
} 

其中適配器是:

的輸出轉換的任何的適配器類 發電機進入特定分配的輸入。

「任何」聽起來讓人放心,但它是標準?我特別擔心隱藏的溢出,這些溢出很難檢測到,並且可能會影響分配的正確性。

+1

這些要求可以在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf(904頁以上)中找到。我找不到答案,但也許你可以? – Escualo

回答

2

您可以使用任何統一的隨機數發生器(URNG)進行任何分配功能。假設分佈函數知道它需要什麼,URNG需要描述它提供的內容,以便分佈函數可以根據需要請求足夠的熵。 (請注意,「引擎」是URNG,具有一些附加要求,如可種植性。)

「通用」適配器您從GNU標準庫的實現提取均勻隨機數發生器G(實際上它的名字是更長的時間,但會變得單調而乏味)和結果類型R,它必須是一個數字類型。 G必須定義G::minG::max,它可以返回的最小值和最大值,它應該以相等的概率返回這些限制之間的所有值。因此很容易知道從G()的調用中可以獲得多少位隨機性。而且,從numeric_limits<R>會告訴我們R需要多少位。因此,劃分可用熵所需的熵告訴適配器需要調用G來產生均勻隨機R多少次。因此,適配器會使用任何產生某種結果類型的URNG /引擎,並使其適應產生不同的結果類型。