获取重复的随机数

时间:2012-08-01 23:34:45

标签: vb.net random

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

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 个答案:

答案 0 :(得分:3)

重复种子问题?

最好将r定义为静态,以便在首次调用时初始化一次。请参阅此答案Random integer in VB.NET

答案 1 :(得分:2)

Random构造函数以Integer为参数,为32位。正如spencer7593所说,只有16位,你每6.5ms重复一次。尝试:

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  

答案 2 :(得分:1)

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

答:答:它可能完全是随机发生的。随机数就是:随机数。在任何时间点,无论是秒或其他时间点的小时数,它都可能与任何其他数字一样出现。无法保证数字不会重复。

另一方面,看起来您的种子值仅为16位。这就像总共65,536种可能性。一毫秒就有10,000个滴答,所以你有6.5毫秒可以重复使用相同的种子。

目前还不清楚VB Random是否正在使用除种子之外的其他种类的熵。 (但是收集包含的熵会减慢初始化,因此可能不会,作为性能考虑。)

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

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


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

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

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

答案 3 :(得分: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

有关详细信息,请参阅Randomize Function (Visual Basic)。希望这会有所帮助。