9

我正在使用一个 System.Random 对象,该对象在整个应用程序中都使用固定种子进行实例化。我正在调用 NextDouble 方法,经过一段时间后,我得到 0.0 作为结果。

有什么补救办法吗,有其他人遇到过吗?

编辑:为了方便起见,我为整个运行设置了一个种子,设置为 1000。random.NextDouble 被调用了几十万次。它是一个优化器应用程序,可以运行几个小时,但这实际上是在执行 10-0 分钟后发生的。我最近向应用程序添加了更多随机调用。

4

5 回答 5

18

.NET 中的随机数生成器不是线程安全的。其他开发人员也注意到了相同的行为,一种解决方案如下(来自http://blogs.msdn.com/brada/archive/2003/08/14/50226.aspx):

class ThreadSafeRandom
{
    private static Random random = new Random();

    public static int Next()
    {
       lock (random)
       {
           return random.Next();
       }
    }
}
于 2008-11-17T15:55:44.743 回答
9

你多久播种一次随机?它应该只在程序开始时执行一次。

一旦使用给定值播种,它将始终产生完全相同的序列。

于 2008-11-17T15:42:01.573 回答
3

Tomas,我之前遇到过这个“错误”,我的解决方案是使 _rnd 变量模块级别:

Private Shared _rnd As System.Random()
Public Shared Function RandRange(ByVal low As Integer, ByVal high As Integer) As Integer
    If _rnd Is Nothing Then
        _rnd = New System.Random()
    End If
    Return rnd.Next(low, high)
End Function
于 2008-11-17T15:56:16.833 回答
3

其他人已经做了体面的工作来解释它并提供解决方案。

无论如何, Erik之前已经回答了一个类似的问题,请查看:

具有相同输出的伪随机发生器

您还可以在以下位置获得与该主题(随机数生成器)相关的更多问题和答案:

Stackoverflow.com 随机数生成器

基因

PS这只是为了补充接受的答案。

于 2008-11-17T16:07:46.250 回答
1

看看这个http://msdn.microsoft.com/en-us/library/system.random.aspx它应该解释为什么你得到相同的值。

于 2008-11-17T15:45:02.690 回答