【问题标题】:Getting Duplicate Random Numbers获取重复的随机数
【发布时间】:2012-08-01 23:34:44
【问题描述】:

我正在使用此共享函数生成基本随机数:

Public Shared Function RandomNumber(ByVal MaxNumber As Integer, Optional ByVal MinNumber As Integer = 0) As Integer

    'initialize random number generator
        Dim r As New Random(Date.Now.Ticks And &HFFFF)

        If MinNumber > MaxNumber Then
            Dim t As Integer = MinNumber
            MinNumber = MaxNumber
            MaxNumber = t
        End If

        Return r.Next(MinNumber, MaxNumber)

End Function

这样调用:dim x as integer = Random(2100000000)

非常简单,种子值直接来自 MS 示例。

这是问题所在:我有时会收到重复的号码,但总是在通常至少相隔 5 或 10 分钟的时间创建。我可以查看我是否每秒或毫秒多次调用该函数,因为这有点“破坏”种子。但这些都在较长的时间跨度内出现。还有什么可能导致这种情况?

【问题讨论】:

    标签: vb.net random


    【解决方案1】:

    重复种子问题?

    最好将 r 定义为 static 以便在第一次调用时初始化一次。参考这个答案Random integer in VB.NET

    【讨论】:

    • 谢谢我正在尝试这种方法。
    • 像冠军一样工作。以前每 1000 个产生大约 15 个重复的运行现在产生 0!
    【解决方案2】:

    Random 构造函数将Integer 作为其 32 位参数。正如spencer7593 所说,只有 16 位,您每 6.5 毫秒重复一次序列。试试:

    Dim r As New Random(Date.Now.Ticks And &HFFFFFFFF)
    

    但是,这会做同样的事情:

    Dim r As New Random()
    

    更好的是,不要每次都创建一个新的Random 对象:

    Private Static r As New Random()  
    Public Shared Function RandomNumber(MaxNumber As Integer, Optional MinNumber As Integer = 0) As Integer  
        ...
        Return r.Next(MinNumber, MaxNumber)  
    End Function  
    

    【讨论】:

    • +1 好答案...不要每次都创建一个新的Random 是要走的路。
    【解决方案3】:

    问:还有什么可能导致这种情况?

    A:这可能纯粹是随机发生的。随机数就是:随机。在任何时间点,无论距离另一个时间点是几秒还是几小时,一个数字出现的可能性与任何其他数字一样。不能保证某个数字不会重复。

    另一方面,您的种子值似乎只有 16 位左右。总共有 65,536 种可能性。一毫秒内有 10,000 个滴答声,因此每 6.5 毫秒您就有可能重复使用同一个种子。

    目前还不清楚 VB Random 是否使用了该种子之外的某种其他熵。 (但为了包含而收集熵会减慢初始化速度,因此出于性能考虑,它可能不会。)

    根据文档,使用相同的种子值创建两个 Random 对象会导致 Random 对象创建唯一数字的重复序列。

    http://msdn.microsoft.com/en-us/library/ctssatww.aspx


    我认为这回答了它为什么会发生的问题。

    我猜下一个问题是为什么需要实例化一个新的Random 对象?如果您需要多个对象,则实例化其中的几个,但确保为每个对象使用不同的种子值将是一种方法。

    但在你去那里之前,我建议你考虑只使用 一个 Random。可以从现有的Random 处理获取随机数的调用,而不是每次需要随机数时都创建一个新的。

    【讨论】:

    • 我将尝试下面的静态方法。 SEED 是如何工作的?我认为它会确定一个数字的起点,但不一定是结果#。正如您所描述的,使用刻度似乎只能得到 65k 个可能的随机整数,都大于 65535。或者这不是它的工作原理?
    • @Kane:你的理解是部分正确的。种子和算法一起确定返回的第一个“随机”数和随后返回的“随机”数。文档说两个使用相同种子值的Random 将生成相同的“随机”数字序列。
    【解决方案4】:

    换一种方式试试:

    Public Function RandomNumber2(ByVal MaxNumber As Integer, Optional ByVal MinNumber As Integer = 0) As Integer
        ' Initialize the random-number generator.
        Randomize()
        ' Generate random value between MaxNumber and MinNumber.
        Return CInt(Int((MaxNumber * Rnd()) + MinNumber))
    End Function
    

    详情请见Randomize Function (Visual Basic)。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 1970-01-01
      • 2011-08-18
      • 2018-06-06
      • 2015-05-25
      • 2018-10-22
      • 2011-09-10
      • 1970-01-01
      • 2018-05-15
      相关资源
      最近更新 更多