ジェネリックの汎用リストのランダムソート
フィッシャー - シャッフル拡張方法
の要素をランダムに破壊します。次のコードブロックは、Fisher-Yatesアルゴリズムを実装するための拡張方法を示しています:
<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>のshuffle()を呼び出してください。たとえば、
List<Product> products = GetProducts();
products.Shuffle();
パフォーマンスに関する考慮事項とスレッドセキュリティの重要性<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)uint.MaxValue / uint.MaxValue * n)));
int k = (int)(box[0] % n);
T value = list[k];
list[k] = list[n - 1];
list[n - 1] = value;
}
}
}</code>
結論
ランダムな汎用リストでは、開発者はSystem.random(利便性のため)またはSystem.security.cryptography(より良いランダム性のため)を使用することを選択できます。さらに、ThreadSaferandomクラスは、マルチスレッドアプリケーションのスレッドセキュリティを確保するのに役立ちます。特定の方法は、必要なランダム性とパフォーマンスの考慮事項に依存します。
以上がC#の一般的なリストを効率的かつ安全にランダムにシャッフルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。