効率的でランダムなソートC#リスト
c#では、一般的なリストのランダムソートは、ソフトウェア開発で一般的なタスクです。たとえば、宝くじアプリケーションでは、限られたデジタルセットでランダムにソートする必要がある場合があります。
ベストプラクティス:
c#では、ランダム設定リストの最も効果的な方法は、フィッシャーイェートシャッフルアルゴリズムに基づいて拡張方法を使用することです。以下に示されている方法は、効率的かつ真にランダムにランダムにランダムなリサシェルリスト要素を保証します:
の使用方法:
<code class="language-csharp">private static Random rng = new Random(); public static void Shuffle<T>(this IList<T> list) { int n = list.Count; while (n > 1) { n--; int k = rng.Next(n + 1); T value = list[k]; list[k] = list[n]; list[n] = value; } }</code>
この拡張メソッドは簡単です。次の例を考えてみましょう: ランダム数ジェネレーターの選択:
上記のコードは
<code class="language-csharp">List<Product> products = GetProducts(); products.Shuffle();</code>メソッドを使用していますが、乱数の潜在的な制限を認めなければなりません。以下に示すように、アプリケーションがより高い品質のランダム性を必要とする場合、
で提供される乱数ジェネレーターを使用できます。 スレッドセキュリティ:
System.Random
スレッドのランダム化を安全に確保するには、次の変更された拡張方法を考慮する必要があります。
System.Security.Cryptography
その中の
<code class="language-csharp">using System.Security.Cryptography; ... public static void Shuffle<T>(this IList<T> list) { using (RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider()) { int n = list.Count; while (n > 1) { byte[] box = new byte[1]; do provider.GetBytes(box); while (!(box[0] < (byte)((double)byte.MaxValue * (double)n / (double)uint.MaxValue))); int k = (int)(box[0] / ((double)byte.MaxValue / n)); T value = list[k]; list[k] = list[n - 1]; list[n - 1] = value; } } }</code>
これらの方法により、ニーズに応じて最も適切なランダムソート方法を選択できます。 リソースの正しいリリースを確保するためにを使用する場合のの重要性に注意してください。
以上がC#のリストを効率的にシャッフルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。