Как определить сложность big O для алгоритма mt19937 - PullRequest
0 голосов
/ 20 июня 2020

Создание массива длины 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] twist () каждые n чисел

 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)
}

Создает следующие n значений из серии x_i

  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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...