ホームページ >バックエンド開発 >C++ >C#の一般的なリストを効率的かつ安全にランダムにシャッフルするにはどうすればよいですか?

C#の一般的なリストを効率的かつ安全にランダムにシャッフルするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-02-03 07:50:11169ブラウズ

How Can I Randomly Shuffle a Generic List in C# Efficiently and Safely?

ジェネリックの汎用リストのランダムソート

ジェネリックリストのランダムソート(デジタルリストなど)は、プログラミングの一般的なタスクです。 C#には、この目的を達成するために、構築された方法、拡張法、さらには第3パーティライブラリを使用できる複数のメソッドがあります。最良の方法と制限を理解することは、最高のパフォーマンスと正確さを得るために不可欠です。

フィッシャー - シャッフル拡張方法

最も一般的に使用される方法の1つは、アルゴリズムをシャッフルするためにフィッシャーイエートを使用することです。このメソッドは、ランダムインデックスで要素を繰り返すことにより、Ilist

の要素をランダムに破壊します。次のコードブロックは、Fisher-Yatesアルゴリズムを実装するための拡張方法を示しています:

この拡張方法を使用するには、ilist
<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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。