System.Random一直返回相同的值

9
我正在使用一个System.Random对象,该对象在整个应用程序中都是以固定种子实例化的。我调用了NextDouble方法,经过一段时间后,我得到了0.0作为结果。
有没有什么解决办法?还有其他人遇到过这种情况吗?
编辑:整个运行过程中我只有一个种子,为了方便起见设置为1000。random.NextDouble被调用了几十万次。这是一个优化器应用程序,可以运行几个小时,但实际上发生在执行10-0分钟后。我最近在应用程序中添加了更多的随机调用。

你能详细说明一下“一些时间”是指多长时间吗?是一个小时,还是数百万个数字的几天?我不认为你在实际函数中遇到了问题,但如果你处于从未测试或计划过的领域,我不会立即排除这种可能性。 - Tom Ritter
可能是重复的问题:随机数生成器只生成一个随机数 - Alexei Levenkov
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();
       }
    }
}

1
如果你的Random实例是应用程序中的静态变量,似乎也可以将[ThreadStatic]属性应用于它。 - Chris Moschini

9

你有多频繁地播种随机数?应该只在程序开始时进行一次。而且,一旦使用给定的值进行播种,它将始终生成完全相同的序列。


3

Tomas,我之前遇到过这个“bug”,我的解决方案是将_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

3

1

新的Random(DateTime.Now.Second)选项仅限于60个不同值的运行。 - Jason Z
为什么不使用默认构造函数,让它为您选择一个种子?保证比这些更好的想法。 - Domenic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接