首页 > 解决方案 > 如何确定 mt19937 算法的大 O 复杂度

问题描述

创建一个长度为 n 的数组来存储生成器的状态

int[0..n-1] MT
int index := n+1
const int lower_mask = (1 << r) - 1 // That is, the binary number of r 1's
const int upper_mask = lowest w bits of (not lower_mask)

从种子初始化生成器

 function seed_mt(int seed) {
 index := n
 MT[0] := seed
 for i from 1 to (n - 1) { // loop over each element
     MT[i] := lowest w bits of (f * (MT[i-1] xor (MT[i-1] >> (w-2))) + i)
  }
}

根据 MT[index] 每 n 个数字调用twist() 提取一个调和值

 function extract_number() {
  if index >= n {
      if index > n {
        error "Generator was never seeded"
        // Alternatively, seed with constant value; 5489 is used in reference C code[50]
      }
      twist()
  }

  int y := MT[index]
  y := y xor ((y >> u) and d)
  y := y xor ((y << s) and b)
  y := y xor ((y << t) and c)
  y := y xor (y >> l)

  index := index + 1
  return lowest w bits of (y)
}

从系列 x_i 生成下 n 个值

  function twist() {
   for i from 0 to (n-1) {
       int x := (MT[i] and upper_mask)
                 + (MT[(i+1) mod n] and lower_mask)
       int xA := x >> 1
       if (x mod 2) != 0 { // lowest bit of x is 1
           xA := xA xor a
       }
       MT[i] := MT[(i + m) mod n] xor xA
   }
   index := 0
}

标签: randomtime-complexitybig-opseudocodemt19937

解决方案


推荐阅读