我在我的代码中有一个循环
Parallel.For(0, Cnts.MosqPopulation, i => { DoWork() });
然而在 DoWork()
函数中,有多个对随机数生成器的调用,其定义如下:
public static class Utils
{
public static readonly Random random = new Random();
}
这是静态实例,因此仅种子一次即可。我可以在整个代码中使用它。
根据MSDN和其他stackoverflow线程,这不是线程安全的。事实上,我注意到有时我的代码会出错,随机数生成器开始生成全零(根据MSDN文档)。
还有其他stackoverflow线程,但它们相当古老,而且实现速度很慢。由于程序是科学计算并运行数百个模拟,我不能浪费时间来生成数字。
自2.0以来,我就没有使用过.net了,我不确定语言如何发展才能使RNG快速、高效、线程安全。
以下是以前的线程:
注意:由于我需要快速实现,所以无法使用相当慢的RNGCryptoServiceProvider。注意2:我没有最小的工作代码。我甚至不知道从哪里开始,因为我不知道线程安全如何工作,也没有高级的c#知识。因此,看起来像是我正在寻求完整的解决方案。
DoWork()
非常简单 - 只有几个if语句。 - masfenix