梅森旋轉算法

維基百科,自由的百科全書
跳到: 導覽搜尋

梅森旋轉演算法Mersenne twister)是一個偽隨機數發生算法。由松本真西村拓士[1]在1997年開發,基於有限二進制字段上的矩陣線性遞歸F_{2}。可以快速產生高質量的偽隨機數, 修正了古典隨機數發生算法的很多缺陷。

Mersenne Twister這個名字來自周期長度取自梅森質數的這樣一個事實。這個算法通常使用兩個相近的變體,不同之處在於使用了不同的梅森質數。一個更新的和更常用的是MT19937, 32位字長。 還有一個變種是64位版的MT19937-64。 對於一個k位的長度,Mersenne Twister會在[0,2^k-1]的區間之間生成離散型均勻分佈的隨機數。

應用[編輯]

梅森旋轉算法是R,Python,Ruby,IDL,Free Pascal,PHP,Maple,Matlab,GMP和GSL的默認偽隨機數產生器。從C++11開始,C++也可以使用這種算法。在Boost C++,Glib和NAG數值庫中,作為外掛程式提供。 在SPSS中,梅森選旋轉算法是兩個PRNG中的一個:另一個是產生器僅僅為保證舊程序的兼容性,梅森旋轉被描述為」更加可靠「。梅森旋轉在SAS中同樣是PRNG中的一個,另一個產生器是舊時的且已經被棄用。

優點[編輯]

最為廣泛使用Mersenne Twister的一種變體是MT19937,可以產生32位整數序列。具有以下的優點:

  1. 有219937 − 1的非常長的周期。在許多軟件包中的短周期—232 隨機數產生器在一個長周期中不能保證生成隨機數的質量。[2]
  2. 在1 ≤ k ≤ 623的維度之間都可以均等分佈(參見定義).
  3. 除了在統計學意義上的不正確的隨機數生成器以外, 在所有偽隨機數生成器法中是最快的(當時)[3]

k-分佈[編輯]

其他選擇[編輯]

算法詳細[編輯]

偽碼[編輯]

下面的一段偽代碼使用MT19937算法生成範圍在[0, 232 − 1]的均勻分佈的32位整數:

 //创建一个长度为624的数组来存储发生器的状态
 int[0..623] MT
 int index = 0
 
 //用一个种子初始化发生器
 function initialize_generator(int seed) {
     i := 0
     MT[0] := seed
     for i from 1 to 623 { // 遍历剩下的每个元素
         MT[i] := last 32 bits of(1812433253 * (MT[i-1] xor (right shift by 30 bits(MT[i-1]))) + i) // 0x6c078965
     }
 }
 
 // Extract a tempered pseudorandom number based on the index-th value,
 // calling generate_numbers() every 624 numbers
 function extract_number() {
     if index == 0 {
         generate_numbers()
     }
 
     int y := MT[index]
     y := y xor (right shift by 11 bits(y))
     y := y xor (left shift by 7 bits(y) and (2636928640)) // 0x9d2c5680
     y := y xor (left shift by 15 bits(y) and (4022730752)) // 0xefc60000
     y := y xor (right shift by 18 bits(y))

     index := (index + 1) mod 624
     return y
 }
 
 // Generate an array of 624 untempered numbers
 function generate_numbers() {
     for i from 0 to 623 {
         int y := (MT[i] & 0x80000000)                       // bit 31 (32nd bit) of MT[i]
                        + (MT[(i+1) mod 624] & 0x7fffffff)   // bits 0-30 (first 31 bits) of MT[...]
         MT[i] := MT[(i + 397) mod 624] xor (right shift by 1 bit(y))
         if (y mod 2) != 0 { // y is odd
             MT[i] := MT[i] xor (2567483615) // 0x9908b0df
         }
     }
 }

SFMT[編輯]

實現[編輯]

參考列表[編輯]

  1. ^ Matsumoto, M.; Nishimura, T. Mersenne twister: a 623-dimensionally equidistributed uniform pseudo-random number generator. ACM Transactions on Modeling and Computer Simulation. 1998, 8 (1): 3–30. doi:10.1145/272991.272995.  編輯
  2. ^ Note: 219937 is approximately 4.3 × 106001; this is many orders of magnitude larger than the estimated number of particles in the observable universe, which is 1087.
  3. ^ P. L'Ecuyer and R. Simard, ``TestU01: A C Library for Empirical Testing of Random Number Generators, ACM Transactions on Mathematical Software, 33, 4, Article 22, August 2007.

外部連結[編輯]