Random.Next() - 找到Nth .Next()

wit*_*ith 4 c# random perlin-noise

鉴于一直播种随机:

Random r = new Random(0);

呼叫r.Next()始终如一地产生相同的系列; 那么有没有办法快速发现该系列中的第N个值,而不调用r.Next() N次?

我的场景是通过创建的大量值r.Next().应用程序偶尔会在任意索引处从数组中读取值.我想通过消除数组来优化内存使用,而是根据需要生成值.但是,强迫r.Next()500万次模拟阵列的第500万个索引比存储阵列更昂贵.是否有可能缩短你的方式到Nth .Next()值,没有/少循环?

Ani*_*Ani 6

我不知道BCL中使用的PRNG的细节,但我的猜测是你会发现很难/不可能为系列的第N个值找到一个漂亮的,封闭形式的解决方案.

这个解决方法怎么样:

使随机数生成器的种子成为所需的索引,然后选择第一个生成的数字.这同样是"确定性的",并且在O(1)空间中为您提供了广泛的范围.

static int GetRandomNumber(int index)
{
    return new Random(index).Next();
} 
Run Code Online (Sandbox Code Playgroud)


ues*_*esp 2

理论上,如果您知道确切的算法和初始状态,您将能够复制该系列,但最终结果将与调用 r.next() 相同。

根据您需要随机数的“好”程度,您可以考虑基于线性同余生成器创建自己的 PRNG ,该生成器相对容易/快速生成数字。如果您可以忍受“糟糕”的 PRNG,那么可能还有其他算法更适合您的目的。这是否比仅存储 r.next() 中的大量数字更快/更好是另一个问题。