8

0 から 100 までの 10 個のランダムな数字を出力する簡単なコードを用意しました。F5 を使用して Visual Studio (C#) でこれを実行すると、同じ数字が 10 回得られます。ただし、F10またはF11を使用して行ごとにデバッグモードで実行すると、10個の異なる数値が得られます(すべて異なるわけではありませんが、ランダム化されています)。

public static void rand() {
    for (int j = 0; j < 10; j++) {
        Random r = new Random();
        Console.WriteLine( r.Next(100));
    }   
}

ループの外で Random r をインスタンス化し、参照によってコピーすることで問題を解決する方法は知っていますが、なぜこれが起こっているのかを理解したいと思います。これはシードと関係があると思いますが、デバッグモードで実行している間、プログラムは動作し、混乱します。

また、デバッグ モードで正しい結果が得られるかどうかを常にテストする必要があるかどうかも疑問です。

4

1 に答える 1

10

Randomインスタンスのものをループの前に作成する必要があります。

public static void rand() {
    Random r = new Random();
    for (int j = 0; j < 10; j++) {        
        Console.WriteLine(r.Next(100));
    }   
}

そして、ここに説明があります:

... デフォルトのシード値はシステム クロックから派生し、有限の分解能を持ちます。その結果、既定のコンストラクターの呼び出しによって連続して作成されるさまざまな Random オブジェクトは、同じ既定のシード値を持つため、同じ乱数のセットが生成されます。この問題は、単一の Random オブジェクトを使用してすべての乱数を生成することで回避できます。...

別のRandomインスタンスを使用する場合は、別のseed値を使用する必要があります。j変数の例:

public static void rand()
{
     for(int j = 0; j < 10; j++)
     {
          Random r = new Random(j);
          Console.WriteLine(r.Next(100));
     }
}

あなたの質問に答える: ... デバッグ モードで正しい結果が得られるかどうかを常にテストする必要がある場合。

いいえ、デバッグ モードの結果を疑う必要はありません。彼らは正しい。それらに対するあなたの理解は間違っている可能性があります。

于 2013-06-07T05:27:16.633 に答える