1

トランプを作っています。シャッフルしようとすると、何かおかしくなりました。

私のプログラムを呼び出す前のコンストラクターは、次のループを通過します(疑似コード、包括的)-

for i in (0,13):
   for j in (0,3):
      new Card(i,j)

とにかく、これは単純化された形式です。基本的に数字とスートのカードが生成されます。問題のコード (C#):

private void Shuffle()
{
    List<Card> newList = new List<Card>();
    while (cards.Count > 0)
    {
        Random r = new Random();
        int next = r.Next(0,cards.Count);
        Console.WriteLine(next);
        Card cur = cards.ElementAt(next);
        newList.Add(cur);
        cards.Remove(cur);
    }
    this.cards = newList;
}

これにより、半予測可能な出力が得られます-つまり、次のようになります。

18 18 18 17 17 17 16 16 15 15 15 14 14 14 13 13 13 12 12 12 11 11 11 10 10 10 9 9 9 8 8 8 7 7 7 6 6 6 5 5 4 4 3 3 1 5 4 3 2 2 1 0

終わり近くでパターンが壊れているように見えますが、その理由はわかりません。もう一度実行すると、異なるがランダムではない出力が得られます。

ただし、ループの外側へのランダム宣言を削除すると、

    private void Shuffle()
    {
        List<Card> newList = new List<Card>();
        Random r = new Random(); /** THE ONLY DIFFERENT LINE **/
        while (cards.Count > 0)
        {
            int next = r.Next(0,cards.Count);
            Console.WriteLine(next);
            Card cur = cards.ElementAt(next);
            newList.Add(cur);
            cards.Remove(cur);
        }
        this.cards = newList;
    }

この場合、はるかに乱数のように見える数値が得られます-

19,28,21,2,16,20,33,26,7,36,31,33,33,26,34,4,18,20,13,27,16,11,18,22,18, 21,21,8,22,12,6,17,2,17,0,11,2,14,9,0,8,10,1,7,4,1,0,0,2,1, 0,0

Visual Studio からコードを公開し、出力されたプログラムを実行すると、この違いが消えるようです。何が起こっているのか混乱しています。私は 4 つのコアを持っているので、これは同じミリ秒でプロセスを 4 つのコアに分散し、それによってシードと同じ数を使用していますか? ただし、コードを公開すると機能する理由については意味がありません...

4

1 に答える 1

4

乱数の生成はシード値から始まります。同じシードを繰り返し使用すると、同じ一連の数値が生成されます。異なるシーケンスを作成する 1 つの方法は、シード値を時間依存にすることです。これにより、Random の新しいインスタンスごとに異なるシリーズが作成されます。デフォルトでは、Random クラスのパラメーターなしのコンストラクターは、システム クロックを使用してシード値を生成します。

宣言をループ内に置くことで、同じ値で何度もコンストラクターを効果的に呼び出しているため、同じ数値が得られます。

ランダムクラス

于 2013-08-13T08:35:25.270 に答える