随机位置不是随机的[vb.net]

时间:2013-03-26 03:22:05

标签: vb.net random

我为我的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()

我不知道为什么它只是做一条对角线,但帮助会非常感激!

2 个答案:

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

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