【发布时间】:2019-12-29 01:39:24
【问题描述】:
我看过几篇关于不要太紧密地生成太多 System.Random 实例的文章,因为它们将使用系统时钟的相同值作为种子,因此返回相同的数字集:
- https://stackoverflow.com/a/2706537/2891835
- https://codeblog.jonskeet.uk/2009/11/04/revisiting-randomness/
- 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实例不同,或者我是否正在阅读过时的文档或错误地阅读文档等。