This维基百科的文章提出了一个仅使用xor和shift的简单RNG:
/* The state word must be initialized to non-zero */
uint32_t xorshift32(uint32_t state[static 1])
{
/* Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs" */
uint32_t x = state[0];
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
state[0] = x;
return x;
}
然而,在那里使用的移位操作用0填充移除的位。假设可用的唯一操作是循环移位和xor,是否可以实现同样简单的长周期RNG?上面的代码不起作用,因为它在几次迭代后循环,这是预期的,因为它是为非循环移位而设计的。
答案 0 :(得分:1)
据我所知,如果使用n位,周期最多为2 * n,即你不能得到很少位的长周期。
原因是在最多 n
次操作后,旋转返回到原点,因此结果为state_n=state_0^someThing
(因为旋转和xor可以合并) 。然后我们再回到state_0。请注意,xoroshiro + 128也有一个班次。