为什么初始化新的System.Random不会产生相同的输出?

Joe*_*lty 0 c# .net-core

据我记得这样的代码将连续产生例如5个相同的数字

for (int i = 0; i < 5; i++)
{
    var rnd = new Random();
    Console.WriteLine(rnd.Next(10));
}
Run Code Online (Sandbox Code Playgroud)

结果:

9 4 0 2 8

因此,每个新值都不同,因此最近几个月System.Random发生了变化吗?年?

Jon*_*eet 5

尽管通常会从当前系统时间开始初始化种子,但从未保证该代码会产生相同的数字,这是许多堆栈溢出问题的原因。

无参数构造函数状态的文档(重点是我的):

默认种子值来自具有有限分辨率的系统时钟。结果,.NET Framework上,通过无参数构造函数的调用紧密连续创建的不同的Random对象将具有相同的默认种子值,因此将生成相同的随机数集。[...] 请注意,此限制不适用于.NET Core。

因此,看起来这基本上已在Core中修复。但这并非总是固定在Core中。我刚刚创建了一个针对多个框架的测试项目,添加了一些预热代码以避免JIT延迟为下一次迭代更改种子,而且.NET Core 1.x似乎与桌面框架存在相同的问题。我怀疑它是针对2.0修复的。