Ниже приведена базовая реализация Xorshift ГСЧ (скопировано из Википедии):
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')
Вот вывод сюжета:
И вот что происходит, когда генерируется 10000 (а не 100) чисел:
Общая тенденция очень ясна. И не забывайте, что ось Y составляет log10
от фактического значения.
Довольно странное поведение, тебе не кажется?