ホームページ > バックエンド開発 > C++ > LINQ を使用してコレクションのサブセットをランダムにシャッフルするにはどうすればよいですか?

LINQ を使用してコレクションのサブセットをランダムにシャッフルするにはどうすればよいですか?

DDD
リリース: 2025-01-01 08:05:09
オリジナル
209 人が閲覧しました

How Can I Randomly Shuffle a Subset of a Collection Using LINQ?

Fisher-Yates-Durstenfeld を使用した LINQ でのサブコレクションのランダム シャッフル

大規模なデータセットを扱う場合、指定されたコレクションから特定のサイズのランダムにシャッフルされたコレクションを取得すると、次のようになります。重要な。これは通常、ランダム化された選択またはサンプリングを含むシナリオで発生します。この問題に対する最適な LINQ ベースのソリューションを検討してみましょう。

Fisher-Yates-Durstenfeld シャッフル アルゴリズムは、ランダム シャッフルに対する効率的で信頼性の高いアプローチを提供します。このコンテキストでは、目標は、「N」要素のコレクションからサイズ「n」のランダムなサブセットを生成することです。ここで、「n」は「N」以下です。

このアルゴリズムを実装するにはLINQ を使用すると、シャッフル操作をカプセル化する拡張メソッドを利用できます。次のコード スニペットは、包括的な実装を提供します。

public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)
{
    if (source == null) throw new ArgumentNullException(nameof(source));
    if (rng == null) throw new ArgumentNullException(nameof(rng));

    return source.ShuffleIterator(rng);
}

private static IEnumerable<T> ShuffleIterator<T>(
    this IEnumerable<T> source, Random rng)
{
    var buffer = source.ToList();
    for (int i = 0; i < buffer.Count; i++)
    {
        int j = rng.Next(i, buffer.Count);
        yield return buffer[j];

        buffer[j] = buffer[i];
    }
}
ログイン後にコピー

この実装では、Shuffle 拡張メソッドは入力シーケンス ソースと rng という名前の Random のインスタンスを受け入れます。入力シーケンスからバッファー リストを作成し、それを反復処理して要素をランダムに選択します。選択された要素は、ランダムな順序を維持した反復子として返されます。

この拡張メソッドを利用するには、入力シーケンスに .Shuffle() を追加し、その後に .Take(n) を追加するだけです。n は目的のサイズを表します。シャッフルされたサブコレクションの。例:

var randomItems = yourCollection.Shuffle().Take(n);
ログイン後にコピー

この Linq ベースのアプローチは、指定されたコレクションから任意のサイズのサブコレクションをランダムにシャッフルして取得するための簡潔で効率的なソリューションを提供します。これは、真のランダム化が必要なシナリオに特に適しています。

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

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