【问题标题】:Why does the xorshift random number generator always seem to use these specific shifts?为什么 xorshift 随机数生成器似乎总是使用这些特定的移位?
【发布时间】:2022-10-14 10:33:21
【问题描述】:

我正在阅读一本解释 xorshift 算法的书(我知道,基本的东西)。然后,在互联网上进行更多搜索时,我发现所有基本示例似乎都将位向右/向左移动相同的“数量”(13、17、5)。

例如:

struct xorshift32_state {
  uint32_t a;
};

uint32_t xorshiftTransform(struct xorshift32_state *state) {
    uint32_t x = state->a;

    x ^= x << 13;
    x ^= x >> 17;
    x ^= x << 5;
    
    return state->a = x;
}

在所有示例中他们使用13175 是否有特殊原因?是的,我也找到了其他例子,但是这个例子不断重复,我不知道数字选择是否微不足道。

【问题讨论】:

    标签: c++ algorithm random xor


    【解决方案1】:

    这实际上比您想象的要微妙和有趣!

    xorshift 随机数生成器有一个有趣的理论背景。移位和异或的使用对应于执行矩阵向量乘积,其中矩阵和向量都由 0 和 1 组成。所讨论的特定矩阵是根据班次大小的选择和这些班次的方向推导出来的。

    为了使 RNG 表现良好(特别是在生成所有可能的值之前不重复任何输出),由移位导出的矩阵必须是可逆的。大多数班次选择不会给出可逆矩阵,xorshift 的作者运行计算机搜索以找到所有可能的班次大小。在详细介绍 RNG 的 xorshift 系列的论文中,作者detailed the specific choice of shifts you mentioned 说如下:

    它使用我最喜欢的选择之一,[a, b, c] = [13, 17, 5],并且将通过几乎所有的随机性测试,除了 Diehard [2] 中的二元秩测试。 (长周期 xorshift RNG 必然使用非奇异矩阵变换,因此每个连续的 n 个向量必须是线性独立的,而真正随机的二进制向量只有大约 30% 的时间是线性独立的。)虽然我只测试了其中的几个,以上 648 种选择中的任何一种都可能提供非常快速、简单、高质量的 RNG。

    所以从某种意义上说,这些数字满足了数学计算所需的理论必要条件,使其成为一个好的 RNG,作者对其进行了测试并在原始论文中将它们单独列出,这就是为什么我猜测它们是如此广泛使用。但也许有一个更好的选择,使用人们还没有开始使用的论文中的其他数字?

    【讨论】:

    • 我还没有读过这篇论文(我会的!)但这个答案正是我想要的。我认为如果有其他选择,[13, 17, 5] 可能由于某种原因是“最好的”,例如简单。
    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    相关资源
    最近更新 更多