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



我看过几篇文章,讨论不要生成太多System.Random实例,因为它们将从系统时钟中使用相同的值进行种子设定,从而返回相同的数字集:

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

对于.net框架4.8来说,这似乎是正确的。 但是,查看 .net core 的源代码,看起来在同一线程上生成的System.Random实例是从[ThreadStatic]生成器中播种的。 所以在我看来,在 .net core 中,您现在可以安全地执行以下操作:

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 core 使用 bcrypt 或其他东西来为每个线程播种全局生成器?

编辑: 现在在此票证中跟踪。

这是真的吗?我错过了什么吗?

我相信您对源代码的阅读是正确的。 但是,除非记录在案,否则不应依赖此行为。 我的猜测是文档根本没有跟上实现的步伐,但您可以在此处打开一个问题以更新文档。

.NET Core 有很多像这样的小增强功能,出于向后兼容性的原因,您可能会犹豫是否要对 .NET Framework 进行增强。

最新更新