A continuación se presenta una implementación básica de la Xorshift RNG (copiado de la Wikipedia):En Xorshift de números aleatorios algoritmo generador de
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));
}
entiendo que w
es el valor devuelto y x
, y
y z
son el estado (variables de "memoria"). Sin embargo, no puedo entender el propósito de más de una variable de memoria. ¿Alguien puede explicarme este punto?
Además, he intentado copiar el código anterior a 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
Entonces, he generado 100 números y se representaron sus log10
valores:
r2 = R2()
x2 = [math.log10(r2()) for _ in range(100)]
plot(x2, '.g')
Aquí está la salida de la trama :
y TH es lo que sucede cuando se generan 10000 (y no 100) números:
La tendencia general es muy clara. Y no olvide que el eje Y es log10
del valor real.
Comportamiento bastante extraño, ¿no crees?
La salida log10 debería haber sido su idea, log10 de máx de 32 bits es 9.something, no 100. –