Microsoft是否更改了随机默认种子?

Luc*_*rri 6 c# random

今天,我在.NET Core中进行了一些测试,并且遇到了一些有趣的事情。

以前(〜.NET Framework 4)Random使用过Environment.TickCount,但现在我相信情况已经改变。

考虑以下代码:

while (true)
{
    Random random = new Random();
    Console.WriteLine(random.Next(0, 10000));
}
Run Code Online (Sandbox Code Playgroud)

在较早的.NET Framework版本中,new Random()空构造函数将使用Environment.TickCount,这将导致伪随机值的重复。

因此,您可以期待如下结果:

542
4211
5244
5244
5244
9501
9501
Run Code Online (Sandbox Code Playgroud)

以此类推。

在使用最新编译器的最新.NET Core版本上,我收到以下结果:

5332
220
3928
524
2973
2840
4965
5667
657
6434
3170
3046
7044
Run Code Online (Sandbox Code Playgroud)

绝对可以改善。

在旧版本中,其他表现出此问题的SO问题:

如何生成随机整数?

在C#中生成没有重复的随机数

非重复随机数

C#随机数生成器线程安全吗?


我的设置:.NET Core 2.2 /最新的C#编译器。


实际问题

所以我的问题是,PRNG是否真的得到了改善,或者他们只是将构造函数更改为使用其他默认种子,如果是,则它们用作种子是什么?密码术现在是否更安全(如果他们实际上改变了实现)?

Luk*_*ker 6

在最新版本的dotnet core中,Random默认构造函数从的隐藏私有实例分配其种子Random。私有实例使用Interop.GetRandomBytes作为其种子。新实例将专用实例的Next()结果用作其种子。

基本上,这使得在循环中创建多个随机实例“安全”。

在corefx GitHub上阅读更多信息:

相关代码文件:私有随机实例默认构造函数-生成种子私有随机实例-生成种子

种子更改请求请求无参数构造函数的种子改进#1919

  • 在探究了GitHub上的corefx问题后,我发现了[这与随机种子有关](https://github.com/dotnet/coreclr/issues/1919),其中引用了[此讨论](https:// github.com/dotnet/coreclr/pull/2192) (2认同)