2013-03-26 113 views
0

我做了一個隨機化功能爲我的再生,它只是使所有在整個形式的對角線重生的事情...代碼是這樣的:隨機位置不是隨機的[vb.net]

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

你的問題有點含糊,但我會提出一個建議。在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 
+0

謝謝..但現在在物體中產卵的東西我該如何阻止它? – user2209912 2013-03-26 03:50:24

+0

我建議改變如果zloc.Y> 595然後進行循環而不是單個測試。 '做雖然zloc.Y> 595:zloc =新點(RandomNumber(playspace.Width),RandomNumber(playspace.Height)):循環' – 2013-03-26 03:56:29

+0

這將阻止它在picturebox1,picturebox2和picturebox3內? Z = COIN1 z.Location = zloc z.Hide() zloc =新點(RandomNumber(playspace.Width),RandomNumber(playspace.Height)) 做,當z.Bounds.IntersectsWith(PictureBox1.Bounds ,PictureBox2.Bounds,PictureBox3.Bounds) zloc =新點(RandomNumber(playspace.Width),RandomNumber(playspace.Height)) 循環 z.Location = zloc z.Show() – user2209912 2013-03-26 04:23:36

0

Random對象,r,具有函數級別範圍,這意味着你在每次進入RandomNumber功能重新初始化。

很多人犯這個錯誤,每次都得到相同的「隨機」數值*。每次你得到一個稍微不同的數字,因爲不是使用默認構造函數,而是使用半隨機種子(從當前毫秒計數)重新初始化它。無論哪種方式,撥打r.Next()的電話仍然沒有做你想做的事情。

爲了解決這個問題,以確保它是在每個調用函數,葫蘆r了一個範圍級別聲明中使用的相同Random對象(例如,以包含類),或在功能標記它Static -水平。

這可能會幫助你足夠快樂。如果不是,那麼你的教育比你希望的要多。 隨機性主題是一個很大的哲學問題。關於這個問題,沒有比the Wikipedia article更好的地方,或者this famous Stack Overflow question

*當然,這是完全允許在「隨機」的定義範圍內。這不僅僅是人們想要的。