.NETで配列をランダム化する最良の方法 質問する

.NETで配列をランダム化する最良の方法 質問する

.NET で文字列の配列をランダム化する最も良い方法は何ですか? 配列には約 500 個の文字列が含まれており、同じ文字列でランダムな順序の新しい配列を作成したいと考えていますArray

回答には C# の例を含めてください。

ベストアンサー1

以下の実装では、フィッシャー・イェーツアルゴリズム別名、Knuth Shuffle。これは O(n) 時間で実行され、その場でシャッフルするため、コード行数は多くなりますが、「ランダムに並べ替える」手法よりもパフォーマンスが優れています。ここ比較パフォーマンス測定のために、System.Random を使用しました。これは暗号化以外の目的には適しています。*

static class RandomExtensions
{
    public static void Shuffle<T> (this Random rng, T[] array)
    {
        int n = array.Length;
        while (n > 1) 
        {
            int k = rng.Next(n--);
            T temp = array[n];
            array[n] = array[k];
            array[k] = temp;
        }
    }
}

使用法:

var array = new int[] {1, 2, 3, 4};
var rng = new Random();
rng.Shuffle(array);
rng.Shuffle(array); // different order from first call to Shuffle

* 長い配列の場合、(非常に大きな) 順列の数を均等に確率化するには、十分なエントロピーを生成するために、各スワップに対して疑似乱数ジェネレータ (PRNG) を何度も繰り返し実行する必要があります。500 要素の配列の場合、PRNG を使用して取得できる順列は 500 通りあり、そのうちのごく一部しか取得できません。ただし、Fisher-Yates アルゴリズムは偏りがないため、シャッフルは使用する RNG と同じくらい優れたものになります。

おすすめ記事