2010-02-12 32 views
23

有沒有人有最喜歡的增強隨機數發生器,你可以解釋一下如何實現它到代碼。我試圖讓梅森扭轉者工作,並想知道是否有人對其他人有偏好。增強隨機數發生器

回答

63

該代碼被從升壓手冊適於在http://www.boost.org/doc/libs/1_42_0/libs/random/index.html

#include <iostream> 
#include "boost/random.hpp" 
#include "boost/generator_iterator.hpp" 
using namespace std; 

int main() { 
     typedef boost::mt19937 RNGType; 
     RNGType rng; 
     boost::uniform_int<> one_to_six(1, 6); 
     boost::variate_generator< RNGType, boost::uniform_int<> > 
        dice(rng, one_to_six); 
     for (int i = 0; i < 6; i++) { 
      int n = dice(); 
      cout << n << endl; 
    } 
} 

爲了解釋位:

  • mt19937是Mersenne扭曲發生器,其產生的原始隨機數。此處使用typedef,因此您可以輕鬆更改隨機數生成器類型。

  • rng是扭曲發生器的一個實例。

  • one_to_six分佈的一個實例。這指定了我們想要生成的數字以及它們所遵循的分佈。這裏我們想要1到6,均勻分佈。

  • dice是需要原始數字和分佈的東西,併爲我們創建了我們實際需要的數字。

  • dice()是用於dice對象,它獲取下一個隨機數的分佈如下,模擬隨機六面骰子擲到operator()的呼叫。

既然這樣,該代碼產生骰子的同一個序列中的每個時間拋出。您可以在生成器的構造函數中隨機化發生器:

RNGType rng(time(0)); 

或使用其seed()成員。

+0

而且是有最小的任何方式和最大的整數分佈的無需構建新的「骰子」而改變? – 2012-06-05 12:58:49

+0

任何人都知道如何設置這個發生器的隨機播種? – 2015-04-30 16:38:36

1

沒有一種適合所有人的RNG。有時統計屬性很重要,有時候是密碼學,有時候是原始速度。

+0

我並不一定想要一個適合所有人的尺寸,我只是知道有些人比另一個更喜歡一個,我想看看哪些人最喜歡。 – shinjuo 2010-02-14 03:19:49

4

我發現這個link它給出了不同的隨機數發生器的性能很好的概述。我已經從上面的鏈接複製的表,爲方便起見:

 
+-----------------------+-------------------+-----------------------------+------------------------+ 
|  generator  | length of cycle | approx. memory requirements | approx. relative speed | 
+-----------------------+-------------------+-----------------------------+------------------------+ 
| minstd_rand   | 2^31-2   | sizeof(int32_t)    |      40 | 
| rand48    | 2^48-1   | sizeof(uint64_t)   |      80 | 
| lrand48 (C library) | 2^48-1   | -       |      20 | 
| ecuyer1988   | approx. 2^61  | 2*sizeof(int32_t)   |      20 | 
| kreutzer1986   | ?     | 1368*sizeof(uint32_t)  |      60 | 
| hellekalek1995  | 2^31-1   | sizeof(int32_t)    |      3 | 
| mt11213b    | 2^11213-1   | 352*sizeof(uint32_t)  |     100 | 
| mt19937    | 2^19937-1   | 625*sizeof(uint32_t)  |     100 | 
| lagged_fibonacci607 | approx. 2^32000 | 607*sizeof(double)   |     150 | 
| lagged_fibonacci1279 | approx. 2^67000 | 1279*sizeof(double)   |     150 | 
| lagged_fibonacci2281 | approx. 2^120000 | 2281*sizeof(double)   |     150 | 
| lagged_fibonacci3217 | approx. 2^170000 | 3217*sizeof(double)   |     150 | 
| lagged_fibonacci4423 | approx. 2^230000 | 4423*sizeof(double)   |     150 | 
| lagged_fibonacci9689 | approx. 2^510000 | 9689*sizeof(double)   |     150 | 
| lagged_fibonacci19937 | approx. 2^1050000 | 19937*sizeof(double)  |     150 | 
| lagged_fibonacci23209 | approx. 2^1200000 | 23209*sizeof(double)  |     140 | 
| lagged_fibonacci44497 | approx. 2^2300000 | 44497*sizeof(double)  |      60 | 
+-----------------------+-------------------+-----------------------------+------------------------+ 

週期的長度:隨機數序列的長度開始之前重複