0

重複の可能性:
1 つの乱数のみを生成する乱数ジェネレーター

リストボックスに5つの乱数を作成して出力するループを作成しようとしています。基本的に、5 つの異なる乱数ではなく、同じ乱数を 5 回出力します。ブレーク ポイントを使用してコードを実行すると、実際には 5 つの数値が生成されます。では、なぜ最初の回答しか出力しないのでしょうか? ありがとうございました。(これはプロジェクト全体ではありませんが、最初にこれを機能させる必要があります)。

    public string Numbertext1;
    public string Numbertext2;       
    public int GeneratedNumbers;
    public int Average = 0;
    public int TotalSum = 0;
    public int TotalCalcs = 0;
    public int Counter = 0;

    private void btnRandomise_Click(object sender, EventArgs e)
    {
        Numbertext1 = txtNum1.Text;
        int Number1;
        int.TryParse(Numbertext1, out Number1);
        Numbertext2 = txtNum2.Text;
        int Number2;
        int.TryParse(Numbertext2, out Number2);

        do
        {

            Random num = new Random();
            int number = num.Next(Number1, Number2);
            lbNumbers.Items.Add(Convert.ToString(number));
            Counter++;
        }
        while (Counter < 5);
        {
            TotalCalcs++;
            Counter = 0;
        }


    }
}
}
4

4 に答える 4

6

numグローバル レベルで変数を初期化する必要があります。同じシードを何度も使用しています。

これを : の一番上に置き、Random num = new Random(); 他のすべてを初期化します。次に、メソッド内から削除します。

于 2012-10-09T00:49:54.557 に答える
3

Randomタイトなループ内で新しいインスタンスを作成しているため、シード番号は同じになります。クラスは(Random数学的な意味で) 完全にランダムではないため、シードを変更するか、シードの 1 つのインスタンスを使用する必要があります。Random num = new Random();他の変数とともに先頭に移動します。

于 2012-10-09T00:50:57.147 に答える
2

乱数ジェネレーターを適切にシードしなかったためです。

ジェネレーターには次のアルゴリズムがあります。シードせずに作成した場合、数値は毎回同じになります。MSDN から引用するには:

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

これを修正するには、シードを指定できる他のコンストラクターを使用します - MSDN に良い例があります。

于 2012-10-09T00:50:57.000 に答える
0

Randomクラスのインスタンス化は時間依存です。非常に速いループでは、毎回同じオブジェクトを作成しているため、同じ値を何度も取得しています。を呼び出したときに新しい番号を取得できるように、インスタンス化をループの外に移動する必要があります Next()

これは、ブレークポイントを使用して値を確認するときに「機能する」理由でもあります。作成した Random オブジェクトは参照時間が異なるため、異なるものになります。

于 2012-10-09T00:58:04.753 に答える