] Об алгоритме генератора случайных чисел Xorshift

Ниже приводится базовая реализация Xorshift RNG (скопировано из Википедии):

uint32_t xor128(void) {
  static uint32_t x = 123456789;
  static uint32_t y = 362436069;
  static uint32_t z = 521288629;
  static uint32_t w = 88675123;
  uint32_t t;

  t = x ^ (x << 11);
  x = y; y = z; z = w;
  return w = w ^ (w >> 19) ^ (t ^ (t >> 8));
}

Я понимаю, что w - это возвращаемое значение, а x , y и z - переменные состояния («памяти»). Однако я не могу понять назначение более чем одной переменной памяти. Может ли кто-нибудь объяснить мне этот момент?

Кроме того, я попытался скопировать приведенный выше код в Python:

class R2:
    def __init__(self):
        self.x = x = 123456789
        self.y = 362436069
        self.z = 521288629
        self.w = 88675123
    def __call__(self):
        t = self.x ^ (self.x<<11)
        self.x = self.y
        self.y = self.z
        self.z = self.w
        w = self.w
        self.w = w ^ (w >> 19) ^(t ^ (t >> 8))
        return self.w

Затем я сгенерировал 100 чисел и построил их log10 значения:

r2 = R2()
x2 = [math.log10(r2()) for _ in range(100)]
plot(x2, '.g')

Вот результат графика:

plot

И вот что происходит, когда генерируется 10000 (а не 100) чисел: y и z - это переменные состояния («памяти»). Однако я не могу понять назначение более чем одной переменной памяти. Кто-нибудь может объяснить мне этот момент?

Кроме того, я попытался скопировать приведенный выше код в Python:

class R2:
    def __init__(self):
        self.x = x = 123456789
        self.y = 362436069
        self.z = 521288629
        self.w = 88675123
    def __call__(self):
        t = self.x ^ (self.x<<11)
        self.x = self.y
        self.y = self.z
        self.z = self.w
        w = self.w
        self.w = w ^ (w >> 19) ^(t ^ (t >> 8))
        return self.w

Затем я сгенерировал 100 чисел и построил их log10 значения:

r2 = R2()
x2 = [math.log10(r2()) for _ in range(100)]
plot(x2, '.g')

Вот результат графика:

plot

И вот что происходит, когда генерируется 10000 (а не 100) чисел: y и z - это переменные состояния («памяти»). Однако я не могу понять назначение более чем одной переменной памяти. Кто-нибудь может объяснить мне этот момент?

Кроме того, я попытался скопировать приведенный выше код в Python:

class R2:
    def __init__(self):
        self.x = x = 123456789
        self.y = 362436069
        self.z = 521288629
        self.w = 88675123
    def __call__(self):
        t = self.x ^ (self.x<<11)
        self.x = self.y
        self.y = self.z
        self.z = self.w
        w = self.w
        self.w = w ^ (w >> 19) ^(t ^ (t >> 8))
        return self.w

Затем я сгенерировал 100 чисел и построил их log10 значения:

r2 = R2()
x2 = [math.log10(r2()) for _ in range(100)]
plot(x2, '.g')

Вот результат графика:

plot

И вот что происходит, когда генерируется 10000 (а не 100) чисел: plot

Общая тенденция очень ясна. И не забывайте, что ось Y - это log10 фактического значения.

Довольно странное поведение, вам не кажется?

10
задан Boris Gorelik 22 December 2010 в 11:27
поделиться