0

毎回ランダムな順序で並べ替えたいリストがあります。

私が遭遇したいくつかの方法があります:

  1. list = list.OrderBy(x => Guid.NewGuid()).ToList();
    
  2. var rnd = new Random();
    myList = myList.OrderBy(x => rnd.Next()).ToList();
    
  3. static Random random = new Random();
    
    public static IEnumerable<T> RandomPermutation<T>(IEnumerable<T> sequence)
    {
        T[] retArray = sequence.ToArray();
    
        for (int i = 0; i < retArray.Length - 1; i += 1)
        {
            int swapIndex = random.Next(i + 1, retArray.Length);
            T temp = retArray[i];
            retArray[i] = retArray[swapIndex];
            retArray[swapIndex] = temp;
        }
    
        return retArray;
    }
    

明らかに1と3ではコード量に大きな違いがありますが、何かメリットはありますか?

4

1 に答える 1

7

最初のものはただの悪です。 GUID は一意ですが、必ずしもランダムではありません。 一部の GUID 実装はランダム性に依存する場合がありますが、そうでないものもありますここでの結果は、あるマシンで実行されたまったく同じプログラムが動作し、別のマシンでは動作しないということです。これは、プログラムをテストし、問題なく動作し、出荷して、問題が発生することを意味するため、非常に悪いことです。

3 つ目は、かなり標準的なシャッフル アルゴリズムです。この問題を解決するとき、それは一般的に私が使うものです。

2 番目のオプションも機能しますが、3 番目のオプションよりも明らかに効率が低下します。並べ替えは、そこに示した 3 番目のアルゴリズム (O(n) ではなく O(n*log(n))) よりも漸近的な複雑さが高くなります。

コードを使用するたびにコードを記述しなければならない場合、12 行ではなく 2 行のメソッドに価値があるかもしれませんが、1 回だけ記述して、いつでもその汎用シャッフル メソッドを参照するだけでよい場合は、意味的に適切でより効率的なコードを使用して正当化できるシーケンスをシャッフルする必要があります。(結局のところ、それほど長くも複雑でもありません。)

于 2013-05-17T18:34:04.600 に答える