下面是一个基本实现Xorshift RNG的(从维基百科复制):在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')
这里是图的输出:
和TH是10000(而不是100)数字生成时发生的情况:
整体趋势非常明显。并且不要忘记Y轴是实际值的log10
。
很奇怪的行为,你不觉得吗?
的日志10输出应该已经是你的线索,最高32位的日志10是9.something,而不是100。 – 2010-12-22 11:52:51