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

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

DDD
リリース: 2025-02-03 08:28:09
オリジナル
651 人が閲覧しました

How Can I Efficiently Shuffle a List in C#?

効率的でランダムなソート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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート