大規模なデータセットを扱う場合、指定されたコレクションから特定のサイズのランダムにシャッフルされたコレクションを取得すると、次のようになります。重要な。これは通常、ランダム化された選択またはサンプリングを含むシナリオで発生します。この問題に対する最適な 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 サイトの他の関連記事を参照してください。