【问题标题】:What is the real definition of the xorshift128+ algorithm?xorshift128+算法的真正定义是什么?
【发布时间】: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:评论似乎(对我来说)使他的偏好非常清楚,尽管他确实说这主要是理论上的。

标签: c++ c algorithm random


【解决方案1】:

感谢@Blastfurnace,答案似乎是根据算法作者的最新一组常量:23、18 和 5。显然这无关紧要,但这些都是理论上的比他最初使用的一组数字要好。 Sebastiano Vigna 制作这些 cmets 是为了响应 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2012-03-30
    • 2011-10-10
    • 2012-08-03
    • 2012-01-30
    相关资源
    最近更新 更多