0

私は自分の再生のためにランダム化関数を作成しました、そしてそれはフォームを横切る対角線でリスポーンするすべてのものを作るだけです...コードはこれです:

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回の再生のコードは次のとおりです。

'コインを再生する
        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()

なぜ対角線になるのかわかりませんが、助けていただければ幸いです。

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ます。rRandomNumber

多くの人がこの間違いを犯し、毎回同じ「ランダム」な値を取得します*。デフォルトのコンストラクターを使用する代わりに、セミランダムシード(クロックからの現在のミリ秒カウント)を使用して再初期化するため、毎回わずかに異なる数値が取得されます。いずれにせよ、への呼び出しr.Next()はまだあなたがしたいことをしていません。

これを修正するRandomには、関数の各呼び出しで使用されるオブジェクトと同じであることを確認するか、スコープレベル(たとえば、包含クラス)の宣言を上げるか、関数レベルでマークします。rStatic

それはおそらくあなたを幸せにするのに十分役立つでしょう。そうでなければ、あなたはおそらくあなたが望んでいたよりも多くの教育を受けています。ランダム性のトピックは、大きな哲学的なものです。このテーマに関するウィキペディアの記事、またはおそらくこの有名なStackOverflowの質問よりも開始するのに適した場所はありません。

*もちろん、これは「ランダム」の定義内で完全に許可されています。それは人々が望んでいるものではありません。

于 2013-03-26T03:40:23.763 に答える