我为我的regen做了一个随机函数,它只是在表格中的对角线上生成所有重生的东西......代码是这样的:
Public Function RandomNumber(ByVal MaxNumber As Integer, _
Optional ByVal MinNumber As Integer = 0) As Integer
'initialize random number generator
Dim r As New Random(System.DateTime.Now.Millisecond)
'if passed incorrect arguments, swap them
'can also throw exception,return 0
If MinNumber > MaxNumber Then
Dim t As Integer = MinNumber
MinNumber = MaxNumber
MaxNumber = t
End If
Return r.Next(MinNumber, MaxNumber)
End Function
和1 regen的代码是这样的:
'regen coins
z = coin1
z.Location = zloc
z.Hide()
zloc = New Point(RandomNumber(playspace.Width), RandomNumber(playspace.Height))
If zloc.Y > 595 Then
zloc = New Point(RandomNumber(playspace.Width), RandomNumber(playspace.Height))
End If
z.Location = zloc
z.Show()
我不知道为什么它只是做一条对角线,但帮助会非常感激!
答案 0 :(得分:0)
你的问题有点模糊,但我会提出一个建议。在RandomNumber函数之外初始化随机数生成器。否则,每次拨打电话时都会创建一个新实例:
'initialize random number generator outside the function
Public _r As New Random(System.DateTime.Now.Millisecond)
Public Function RandomNumber(ByVal MaxNumber As Integer, Optional ByVal MinNumber As Integer = 0) As Integer
' ensure min is less than max
If MinNumber > MaxNumber Then
Return _r.Next(MaxNumber, MinNumber)
Else
Return _r.Next(MinNumber, MaxNumber)
End If
End Function
答案 1 :(得分:0)
您的Random
对象r
具有功能级范围,这意味着每次进入RandomNumber
函数时都会重新初始化它。
很多人犯了这个错误,每次 * 都得到相同的“随机”值。每次都会得到一个稍微不同的数字,因为您不是使用默认构造函数,而是使用半随机种子(来自时钟的当前毫秒计数)重新初始化它。无论哪种方式,对r.Next()
的调用仍然没有按照您的意愿进行。
要解决此问题,确保它与每次调用函数时使用的Random
对象相同,将r
的声明提升到范围级别(例如,包含()),或在功能级别标记Static
。
这可能有助于让你开心。如果没有,你接受的教育比你希望的更多。 随机性的主题是一个很重要的哲学问题。没有比the Wikipedia article关于这个问题更好的起点,或者this famous Stack Overflow question。
* 当然,在“随机”的定义中完全允许这样做。这不是人们想要的东西。