0

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

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 分钟的时间创建。我可以查看我是否每秒或毫秒多次调用该函数,因为这有点“破坏”种子。但这些都在较长的时间跨度内出现。还有什么可能导致这种情况?

4

4 回答 4

3

重复种子问题?

将 r 定义为 static 可能会更好,以便在第一次调用时初始化一次。请参阅此答案VB.NET 中的随机整数

于 2012-08-01T23:46:53.093 回答
2

构造Random函数将一个Integer32 位的参数作为其参数。正如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  
于 2012-08-02T03:38:21.510 回答
1

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

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

另一方面,看起来你的种子值只有 16 位左右。总共有 65,536 种可能性。一毫秒内有 10,000 个滴答声,所以每 6.5 毫秒你就有可能重用同一个种子。

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

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

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


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

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

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

于 2012-08-01T23:46:13.173 回答
0

尝试另一种方式:

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

有关更多详细信息,请参见随机化函数 (Visual Basic)。希望这可以帮助。

于 2012-08-02T09:56:03.330 回答