我正在使用此共享功能生成基本的随机数:
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分钟的时间内创建。我可以看到我是否每秒或毫秒多次调用该函数,因为这会“破坏”种子。但这些都是在延长的时间范围内出现的。还有什么可能导致这个?
答案 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)。希望这会有所帮助。