我需要一个好的伪随机数发生器(PRNG),看起来当前的技术水平是xorshift128 + algoritm.不幸的是,我发现了2个不同的版本.维基百科上的那个:Xorshift显示为:
uint64_t s[2]; uint64_t xorshift128plus(void) { uint64_t x = s[0]; uint64_t const y = s[1]; s[0] = y; x ^= x << 23; // a s[1] = x ^ y ^ (x >> 17) ^ (y >> 26); // b, c return s[1] + y; }
这似乎很直接.更重要的是,编辑日志似乎显示这个代码片段是由名为"Vigna"的用户添加的,该用户可能是"Sebastiano Vigna",他是xorshift128 +论文的作者:Marsaglia的xorshift生成器的进一步组织.不幸的是,该文件中的实施略有不同:
uint64_t next(void) { uint64_t s1 = s[0]; const uint64_t s0 = s[1]; s[0] = s0; s1 ^= s1 << 23; // a s[1] = s1 ^ s0 ^ (s1 >> 18) ^ (s0 >> 5); // b, c return s[1] + s0; }
除了一些不同的名称,这两个片段是相同的,除了最后两个班次.在维基百科版本中,这些转变是17和26,而论文的转变是18和5.
有谁知道哪个是"正确的"算法?这有什么不同吗?这显然是一种相当广泛使用的算法 - 但使用的版本是什么?