2012-12-12 15 views
5

可能性の重複は:
Random number generator only generating one random numberコードはデバッガでステップ実行するときにのみ正しく実行されますか?

私は少しはこのしばらく前に困惑しました。 (システム時間ベース)

public blockType generateRandomBlock() 
{ 
    Random random = new Random(); 
    int makeBlockOfType = random.Next(0, 100); 

    blockType t = blockType.normal; 
    if (makeBlockOfType <= 80 && makeBlockOfType >= 60) 
    { 
     t = blockType.blue; 
    } 
    else if (makeBlockOfType > 80 && makeBlockOfType <= 95) 
    { 
     t = blockType.orange; 
    } 
    else if (makeBlockOfType > 95 && makeBlockOfType <= 100) 
    { 
     t = blockType.green; 
    } 

    return t; 
} 

かなり単純な、それはランダムに生成された番号に基づいてenum値を返す:私は、次のコードを持っています。残念なことに、いくつかの奇妙な理由から、すべてのブロックが1つの色かそれ以外の色を持っています。しかし、これをデバッガでステップ実行して実行した後に結果を確認すると、ブロックが複数の色になっていることがわかりました。なぜこれが起こっているのか、私は少し混乱しています。

このため、Microsoftの代わりにMonoコンパイラを使用するMonoGameを使用しています。これが問題だろうか?私は、このコードをコンストラクタにインラインで配置しようとしましたが、どこから呼び出されているのでしょうか(私はコンパイラがコードをインラインで推測していると思います)。

ビルドを実行させるのではなく、Visual Studioを個別に再起動しようとしました。変更はありません。

ご意見、ご協力をお待ちしております。

+1

試みをする方法のうち、ランダム作成を移動するには、それが役立つはずです。 –

+0

'新しいRandom()'シードは時間を使用します。これは数ミリ秒間一定のままです。 – CodesInChaos

+0

デバッグでは、呼び出しの間に時間があり、実際には異なる種を取得するためです。 – Archy

答えて

3

Randomの複数のインスタンスを非常に短時間で連続して作成すると、同じ時間依存のシード値で初期化される可能性があります。

この問題を回避するには、代わりにインスタンスフィールドとしてごRandomを初期化する必要があります。

private readonly Random random = new Random(); 

public blockType generateRandomBlock() 
{ 
    int makeBlockOfType = random.Next(0, 100); 

    // ... 
} 
7

あなたは同様のを参照して、(コンストラクタでプライベートフィールドとインスタンス化するように設定)一度だけランダムをインスタンス化する必要があります質問:シード値から

乱数生成が開始:Random.Next returns always the same values

Random documentationを参照してください。同じ シードが繰り返し使用されている場合は、数字の同じシリーズをお使いの場合には

を生成し、あなたは同じシード(時間的に近すぎる)とランダムなインスタンスを作成して、あなたは次のようになります最初の値をとります与えられた種子についても同じです。乱数ジェネレータのシードとして

public blockType generateRandomBlock() 
{ 
    Random random = new Random(); 

これは、連続した呼び出しのために同じ値を返します、時間に基づいています。

4

あなたはすべての時間があなたのメソッドを呼び出して、あなたの乱数ジェネレータを再作成しています。

ルーチン外の発電機のあなたの創造を移動:

Random random = new Random(); 
public blockType generateRandomBlock() 
{ 
関連する問題