以下是Xorshift随机数生成器的基本实现(摘自维基百科):
我了解到
此外,我试图将上述代码复制到Python中:
这是图表的输出结果: 当生成10000个数字(而不是100个)时,会发生以下情况: 总体趋势非常明显。不要忘记Y轴是实际值的log10。
相当奇怪的行为,你觉得呢?
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。
相当奇怪的行为,你觉得呢?