【问题标题】:Do multiple instances of System.Random still use the same seed in .Net Core?System.Random 的多个实例是否仍然在 .Net Core 中使用相同的种子?
【发布时间】:2019-12-29 01:39:24
【问题描述】:

我看过几篇关于不要太紧密地生成太多 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 票证中进行跟踪。

【问题讨论】:

  • 我不确定您为什么需要Random数组。这有什么用例?
  • @Igor 抱歉,可能是沟通不畅——这个问题并不是关于System.Random 的最佳实践。我想知道,在 .net 核心中,System.Random 实例的播种是否与 .net 框架中的 System.Random 实例不同,或者我是否正在阅读过时的文档或错误地阅读文档等。

标签: c# .net-core


【解决方案1】:

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

我相信您对源代码的阅读是正确的。但是你不应该依赖这种行为,除非它被记录在案。我的猜测是文档根本没有跟上实现,但你可以打开一个问题here 来更新文档。

.NET Core 有很多像这样的小改进,出于向后兼容的原因,您可能会犹豫对 .NET Framework 进行哪些改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2018-06-24
    • 1970-01-01
    • 2011-12-24
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多