gpt4 book ai didi

c++ - xorshift128+ 算法的真正定义是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:06 25 4
gpt4 key购买 nike

我需要一个好的伪随机数生成器 (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;
}

这看起来很简单。更重要的是,编辑日志似乎显示该代码片段是由名为“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;
}

除了一些不同的名称外,这两个片段除了最后两个类次外是相同的。在维基百科版本中,这些偏移是 17 和 26,而论文中的偏移是 18 和 5。

有谁知道哪个是“正确的”算法?这有什么不同吗?这显然是一种使用相当广泛的算法 - 但使用的是哪个版本?

最佳答案

感谢@Blastfurnace,根据算法的作者,答案似乎是最新的常量集是:23、18 和 5。显然这无关紧要,但理论上这些是比他最初使用的一组数字更好。 Sebastiano Vigna 发表这些评论是为了回应 news that the V8 Javascript engine 正在转向使用该算法。

我使用的实现是:

uint64_t a = s[0];
uint64_t b = s[1];

s[0] = b;
a ^= a << 23;
a ^= a >> 18;
a ^= b;
a ^= b >> 5;
s[1] = a;

return a + b;

关于c++ - xorshift128+ 算法的真正定义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34426499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com