我需要一个快速随机数生成器,它允许我随机访问随机数序列的各个位置的数字。我之所以选择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跳过大量的随机数,而不计算其间的每个随机数?
作为替代方案,我可以使用另一个随机数生成器。你能建议一个允许快速跳过的人吗?
答案 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)