【发布时间】:2016-03-29 08:19:13
【问题描述】:
我需要一个好的伪随机数生成器 (PRNG),目前最先进的技术似乎是 xorshift128+ 算法。不幸的是,我发现了 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;
}
这似乎很简单。更重要的是,编辑日志似乎显示此代码 sn-p 是由名为“Vigna”的用户添加的,该用户可能是“Sebastiano Vigna”,他是 xorshift128+ 上论文的作者:Further scramblings of Marsaglia’s xorshift generators。不幸的是,该论文中的实现略有不同:
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;
}
除了一些不同的名称,这两个 sn-ps 是相同的,除了最后两个班次。在 Wikipedia 版本中,这些变化是 17 和 26,而论文中的变化是 18 和 5。
有谁知道哪个是“正确”的算法?这有什么不同吗?这显然是一种相当广泛使用的算法 - 但使用的是哪个版本?
【问题讨论】:
-
我发现this Sebastiano Vigna public comment 引用了不同的常量值。两种算法都“对”,可以联系作者询问是否有首选版本。
-
@blastfurnace - 谢谢,这正是我所需要的。
-
@Blastfurnace:评论似乎(对我来说)使他的偏好非常清楚,尽管他确实说这主要是理论上的。