2016-05-10 14 views
0

ランダムにオブジェクトを選択するために1と4の間の数字をランダムに生成しようとしています(この場合は小惑星)、それがある場所に移動し、再表示(スポーン)するように指示します。vb.net:非共有メンバーへの参照では、random.nextでオブジェクト参照が発生する必要があります

If Globals.pathA = True Then 
     Globals.astroidspawn_a1 = Random.Next(1, 4) 

そして

If Globals.astroidspawn_a1 = 1 Then 
      astroid1.Location = New Point(800, 55) 
      astroid1.Visible = True 
     End If 

この第二セクションは、産卵小惑星もたらす複数回繰り返します。

"Random.Next"というコードは、 "共有されていないメンバーへの参照にはオブジェクト参照が必要です"というコードエラーとみなされます。

答えて

2

ランダムクラスのインスタンスが必要です。好ましい方法は、Shared変数を使用することです。これにより、ランダム性が向上します。フォーム/クラスに以下の

場所:

Private Shared _rnd As New Random 

ザ・あなたが値たいとき:

Globals.astroidspawn_a1 = _rnd.Next(1, 4) 
-1

Next()Randomのインスタンスから呼び出されるように設計された機能ですクラス。最初に、オブジェクト変数を宣言して初期化し、次にオブジェクト変数のNext()を呼び出す必要があります。

コードを修正するための一つの簡単な方法は、Next()を呼び出す前に、必要に応じて新しいRandomクラスをインスタンス化することです。このアプローチの

If Globals.pathA = True Then 
    Dim randomizer = New Random() 
    Globals.astroidspawn_a1 = randomizer.Next(1, 4) 

一つの欠点は、乱数が真にランダムではないということである - それらはとして知られていますシード値を取り、そのシードに基づいて新しい数値を生成する。同じシードに基づく一連の数字は毎回同じです。上記の例では、デフォルトのシード値は時計の時間に基づいています。つまり、ループ内で呼び出された場合、同じ値を何度も生成する可能性があります。

修正する方法は、クロックタイムに基づいていないRandomオブジェクトコンストラクタに明示的に新しいシードを渡すことです。種子は、その後、同様にランダム化されるよう

If Globals.pathA = True Then 
    Dim randomizer = New Random(Guid.NewGuid().GetHashCode()) 
    Globals.astroidspawn_a1 = randomizer.Next(1, 4) 

これは本当にランダムな値を作成する必要があります。ここでは一つの方法です。

+0

IMOのように良い解決策ではありませんインスタンスとGUIDの作成を維持するよりも、* 1つの* Shared *ランダムクラス* 1回*を作成する方がはるかに効率的です –

関連する問題