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

C#のリストをランダムにシャッフルするにはどうすればよいですか?

DDD
DDDオリジナル
2025-02-03 08:24:16737ブラウズ

How Can I Randomly Shuffle a List in C#?

C#リストのランダム化)の要素をシャッフルするための効率的な方法について説明します。 焦点は、広く使用されている漁師のシャッフルアルゴリズムにあります

フィッシャー - シャッフルアルゴリズム

Fisher-Yates Shuffleは、リスト順序をランダム化するための実証済みのアルゴリズムです。 ここでは、すべてのIlist

のための簡潔な拡張方法として実装されています。

ここで、

クラスのインスタンスを表します。

<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>
乱数生成オプション

rng Random標準

クラスでは、多くのアプリケーションで十分です。 ただし、より高い暗号化のセキュリティとランダム性の向上を必要とする状況については、の名前を使用することを検討してください。 このバージョンは、ランダム性を強化するためにを使用します。 生成された乱数が必要な範囲内にあることを確認するために追加されたチェックに注意してください。

使用例System.RandomSystem.Security.Cryptography

両方の方法が同じように使用されています:
<code class="language-csharp">public static void Shuffle<T>(this IList<T> list)
{
    using (var provider = new RNGCryptoServiceProvider())
    {
        int n = list.Count;
        while (n > 1)
        {
            byte[] box = new byte[1];
            do provider.GetBytes(box);
            while (!(box[0] < (byte)((n + 1) * (double.MaxValue / 256)))); //Ensure value within range
            int k = box[0] % (n + 1);
            T value = list[k];
            list[k] = list[n];
            list[n] = value;
        }
    }
}</code>

RNGCryptoServiceProvider

パフォーマンスに関する考慮事項は速度を提供しますが、は優れたランダム性を提供しますが、パフォーマンスの犠牲を払っています。 アプリケーションのニーズに基づいて適切な方法を選択します。 ほとんどの汎用シャッフルの場合、は完全に適切です。

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

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