高效的Xorshift跳过

时间:2012-07-27 17:34:10

标签: c++ algorithm random

我需要一个快速随机数生成器,它允许我随机访问随机数序列的各个位置的数字。我之所以选择Xorshift,是因为它快速且易于实现。

为了从序列中获取特定的随机数,我实现了以下方法(mPos保存下一个随机数的位置):

void XorshiftRandomGenerator::skipTo(unsigned int pos)
{
    // Reset if we passed the position
    if (mPos>pos)
        reset();

    // Generate random numbers until we're done
    while (mPos<pos)
        random();
}

后续random()将返回所需的数字,但此方法非常昂贵。有没有办法用Xorshift跳过大量的随机数,而不计算其间的每个随机数?

作为替代方案,我可以使用另一个随机数生成器。你能建议一个允许快速跳过的人吗?

3 个答案:

答案 0 :(得分:2)

Forest B. Brown在1994年发表了一篇名为Random Number Generation with Arbitrary Strides的论文,其中涉及这一主题。

正如Nabb在评论中所说,线性同余生成器可用于有效跳过。当然,通常advantages and disadvantages的液化天然气适用:事物简单而快速,但伪随机数的质量不是很高。该公式详细解释了here

答案 1 :(得分:1)

您可以使用随机数生成器的层次结构。即使用生成器A生成的每个数字都用作生成器B的种子,它生成100个数字,然后从A获取下一个数字以重新初始化自己并生成接下来的100个数字等。这样您就可以逐步向前跳过你当然可以把它级联成一个发电机树。

答案 2 :(得分:0)

你当然可以跳进xorshift,这个过程被描述为here,但我还没有为自己阅读,所以我不知道跟随它是多么容易。

或者,您可以通过使用底层LCG(与@Daerst的答案相同)来查看提供跳转功能的PCG,但对其进行后处理以改善其统计属性,或者某些可分割生成器描述here。例如,SplitMix生成器只有一个常量的循环加法,因此要跳过任意距离,只需将跳跃距离乘以常量并添加(here&#39;一个SplitMix派生词显然通过BigCrush)。