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

C#で一般的なリストを効率的にシャッフルするにはどうすればよいですか?

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

ジェネリックの汎用リストの効率的なシャッフル方法

さまざまなプログラミングシナリオでは、ランダムに一般的なリストの要素の順序は一般的な操作です。この記事では、C#でこの目標を達成するための最良の方法を紹介します。

Fisher-Yates Shuffle Algorithmの実装

最も推奨される方法は、Fisher-Yatesシャッフルアルゴリズムを使用することです。これは、よく知られているリストランダム化アルゴリズムです。この方法を使用するには、以下に示すように拡張メソッドを定義してください。

<code class="language-csharp">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">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)n / 256))); //确保生成的随机数在范围内
            int k = (int)(box[0] * (n / 256.0));
            T value = list[k];
            list[k] = list[n - 1];
            list[n - 1] = value;
            n--;
        }
    }
}</code>
の新しい例を作成することです。

更新された拡張方法

ThreadSafeRandomスレッドセキュリティメソッドをシャッフルエクステンション方法に統合します:

<code class="language-csharp">public static class ThreadSafeRandom
{
    [ThreadStatic] private static Random Local;

    public static Random ThisThreadsRandom
    {
        get { return Local ?? (Local = new Random(unchecked(Environment.TickCount * 31 + Thread.CurrentThread.ManagedThreadId))); }
    }
}</code>

この復活した答えは、クレアレラーランプレーニングを提供し、コードの読みやすさ(特にrngcryprovider examph)を改善し、安全上の懸念をより効果的に扱います。

以上がC#で一般的なリストを効率的にシャッフルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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