3

一意の乱数を取得しようとしていますが、コードを実行するたびに常に同じ番号を取得します。最初に 14 を取得し、次に 6 を取得しますが、使用されているすべての数値を保持するためのリストが機能していないようです。14 を手動で追加すると機能しますが、randInt を追加すると機能しません。

const int numCards = 32;
        List<int> usedCards = new List<int>();
        int randInt = 0;
        Random rand = new Random(numCards);
        usedCards.Add(14);
        do
        {

            randInt = rand.Next(0, numCards);
            MessageBox.Show(randInt.ToString(), "End Game", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

        }
        while (usedCards.Contains(randInt));

        usedCards.Add(randInt);
4

2 に答える 2

17

交換:

Random rand = new Random(numCards);

Random rand = new Random();

コンストラクター呼び出しで固定シード値 (常に同じ値を持つ) を指定すると、次のように、同じシード値に対して常に同じである予測可能numCards再現可能なシーケンスが得られます (完全ではありませんが、それでもポイントは有効です) Random

ここに画像の説明を入力

たとえば、固定シードを使用して、10 から 100 までの範囲の 10 個の数字を描画すると、私のマシンでは常にシーケンスが生成されます

24,11,46,77,65,43,35,94,10,64

一方、シード値を使用しないと、シーケンスは予測不能になります。

シード値が渡されないとRandom 、現在の時刻に基づいて新しいシード値が生成されます。これが、乱数の新しいシーケンスを取得したいものです-高速で再度初期化しない限り、再設定する必要があるのはそのためです-Random毎回インスタンスを再作成するのではなく、インスタンスを使用します。

于 2012-04-20T02:14:56.957 に答える