【问题标题】:System.Random keeps on returning the same valueSystem.Random 不断返回相同的值
【发布时间】:2010-09-22 16:38:18
【问题描述】:

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

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

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

【问题讨论】:

  • 你能详细说明一下“一段时间”吗?我们是在谈论一个小时还是数天的数百万个数字?我不认为您在实际功能中遇到了问题,但如果您处于从未经过测试或计划的领域,我不会立即打折。

标签: .net random


【解决方案1】:

.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();
       }
    }
}

【讨论】:

  • 看起来你也可以将 [ThreadStatic] 属性应用到你的 Random 实例,如果它是你的应用程序中的一个静态变量。
【解决方案2】:

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案4】:

      其他人已经很好地解释了它并提供了解决方案。

      反正Erik之前回答过一个类似的问题,看看吧:

      Pseudo Random Generator with same output

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

      Stackoverflow.com random-number-generator

      基因

      附注这只是为了补充已接受的答案。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 新的 Random(DateTime.Now.Second) 选项限制为 60 个不同的值运行。
        • 为什么不直接使用默认构造函数,让它为你挑选种子?保证比这些更好。
        猜你喜欢
        • 2012-07-02
        • 2015-06-30
        • 2021-10-07
        • 2014-08-28
        • 2015-05-18
        • 1970-01-01
        • 1970-01-01
        • 2017-02-12
        • 2017-02-20
        相关资源
        最近更新 更多