System.Random的多个实例是否仍在.Net Core中使用同一种子?

时间:2019-08-23 18:12:20

标签: c# .net-core

我已经看过几篇文章,它们讨论的是不要太紧密地生成过多的System.Random实例,因为它们将从系统时钟中获得相同的值作为种子,并因此返回相同的数字集:

  1. https://stackoverflow.com/a/2706537/2891835
  2. https://codeblog.jonskeet.uk/2009/11/04/revisiting-randomness/
  3. https://docs.microsoft.com/en-us/dotnet/api/system.random?view=netframework-4.8#instantiating-the-random-number-generator

.net framework 4.8似乎是正确的。 但是,查看.net core的源代码,似乎是从System.Random生成器中播种了在同一线程上生成的[ThreadStatic]的实例。 因此在我看来,在.net核心中,您现在可以安全地执行以下操作:

Random[] randoms = new Random[1000];
for (int i = 0; i < randoms.Length; i++)
{
  randoms[i] = new Random();
}
// use Random instances and they'll all have distinct generated patterns

这是真的吗?我想念什么吗?

注意:假设我们在这里谈论的是单个线程(尽管我不确定它是否重要,因为看起来.net内核使用bcrypt或某种东西为每个线程生成全局生成器种子?)。

编辑: 现在在this票证中对此进行了跟踪。

1 个答案:

答案 0 :(得分:5)

  

这是真的吗?我想念什么吗?

我相信您对源代码的阅读是正确的。但是除非记录下来,否则您不应该依赖此行为。我的猜测是文档只是跟不上实现,但是您可以打开问题here来更新文档。

.NET Core具有许多类似的小改进,出于向后兼容的原因,您可能会犹豫是否要对.NET Framework进行改进。