每次将 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 可以“向前跳跃”大量步骤以生成彼此独立的伪随机数序列。
另请参阅:
我有机会看到一些有趣的代码,要么被用作愚人节玩笑(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 可以“向前跳跃”大量步骤以生成彼此独立的伪随机数序列。
另请参阅: