每次将 RNG 种子增加 1 是否确保不会获得相同的连续值?

Does increasing RNG seed by 1 each time ensure not getting same consecutive values?

我有机会看到一些有趣的代码,要么被用作愚人节玩笑(4 月 1 日更新为 public),要么只是一个错误,因为有人不明白如何使用随机数生成器。

问题与 Random class 作为 .NET/C# 的一部分有关,但也许其他 RNG 的工作方式相同。

我找到的代码的简化版本,去掉所有不必要的细节后,看起来像这样:

for ( int i = startI; i < stopI; ++i ) {
    int newValue = new Random( i ).Next( 0, 3 ); // new RNG with seed i generates a single value from 3 options: 0, 1 and 2
    // rest of code
}

我在 LINQPad 中对该代码进行了 运行 简单测试,看看我在程序中观察到的是否只是我的 "luck",或者这是否真的是 RNG 使用这种方式的方式。这是代码:

int lastChoice = -1;
int streakLength = -1;

for ( int i = 0; i < 100000000; ++i ) {
    int newChoice = new Random( i ).Next( 0, 3 );
    if ( newChoice == lastChoice ) {
        streakLength++;
        ( i + ";" + lastChoice + ";" + streakLength ).Dump();
    } else {
        lastChoice = newChoice;
        streakLength = 1;
    }
}

"The End".Dump();

Dump() 方法只是将值打印到屏幕上)

运行宁此 "script" 的结果只是 "The End",仅此而已。这意味着,对于生成随机值的 100M 个周期,没有一次能够生成相同的连续值,当只有其中的 3 个作为选项时

所以回到我的标题问题 - 每次增加 RNG 的种子(特别是 .NET/C#'s Random class,但也欢迎一般性回答) (整数)随机数生成将确保不会出现重复的连续值?或者这只是纯粹的运气?

您表现出的行为取决于 PRNG。

对于许多 PRNG,包括线性 PRNG,例如在 .NET Framework 中实现的 System.Random,如果您使用连续种子初始化 PRNG 的两个实例,它们产生的数字序列可能与每个 PRNG 相关其他,即使这些序列中的每一个都会自己产生随机行为的数字。您在问题中描述的行为只是其中一种可能的结果。

特别是 System.Random,这种现象在“A Primer on Repeatable Random Numbers”中有更详细的描述。

然而,其他 PRNG 为每个种子提供了自己独立的伪随机数序列(一个例子是 SFC64 和基于计数器的 PRNG;参见,例如,“平行随机数:与 1、2、3 一样简单”),并且一些 PRNG 可以“向前跳跃”大量步骤以生成彼此独立的伪随机数序列。

另请参阅: