0

我为我的 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 的代码是这样的:

'再生币
        z =硬币1

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()

我不知道为什么它只是一条对角线,但非常感谢您的帮助!

4

2 回答 2

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
于 2013-03-26T03:39:00.130 回答
0

您的Random对象r具有函数级范围,这意味着您在每次进入RandomNumber函数时重新初始化它。

很多人犯了这个错误,每次都得到相同的“随机”值*。每次都会得到一个稍微不同的数字,因为不是使用默认构造函数,而是使用半随机种子(时钟的当前毫秒数)重新初始化它。无论哪种方式,调用r.Next()仍然没有做你想做的事。

要解决此问题,请确保Random在每次调用函数时使用相同的对象,将声明提升r到作用域级别(例如,到包含类),或Static在函数级别标记它。

这可能足以让你开心。如果没有,那么您将接受比您可能希望的更多的教育。随机性是一个很大的哲学话题。没有比维基百科关于这个主题的文章更好的起点了,或者这个著名的 Stack Overflow 问题

*当然,这在“随机”的定义中是完全允许的。这不是人们想要的。

于 2013-03-26T03:40:23.763 回答