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

LINQ を使用してコレクションからランダムなサブセットを効率的に取得するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-31 20:01:14
オリジナル
905 人が閲覧しました

How Can I Efficiently Get a Random Subset from a Collection Using LINQ?

LINQ の最適化: ランダムにシャッフルされたサブコレクションの取得

より大きなコレクションのランダムなサブセットを取得する効率的な方法を決定することは、プログラミング。 LINQ クエリの場合、Shuffle() 拡張メソッドを利用する方法があります。

Shuffle メソッド:

Shuffle() メソッドは、IEnumerable コレクションを入力として受け取ります。そしてシャッフルされたバージョンを返します。このメソッドは、コレクション内の要素のランダムな順序を取得する必要がある場合に特に便利です。

Fisher-Yates-Durstenfeld Shuffle:

Shuffle() メソッドFisher-Yates-Durstenfeld シャッフル アルゴリズムを採用しており、コレクションをシャッフルする堅牢かつ効率的な手段を提供します。このアルゴリズムでは、要素を後続の要素とランダムに交換しながらコレクションを反復処理します。

LINQ 拡張メソッド:

以下は、Fisher を実装する LINQ フレンドリーな拡張メソッドです。 IEnumerable で使用する Yates-Durstenfeld シャッフルコレクション:

public static class EnumerableExtensions
{
    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
    {
        return source.Shuffle(new Random());
    }

    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() メソッドを利用するには、目的のコレクションでこのメソッドを呼び出すだけです:

var yourCollection = new List<int> { 1, 2, 3, 4, 5 };
var randomItems = yourCollection.Shuffle().Take(3);
ログイン後にコピー

これにより、あなたのコレクションから 3 つのランダムなアイテムのシャッフルされたコレクションが生成されます。デフォルトでは、Shuffle() メソッドはランダム化に新しい Random() インスタンスを使用します。カスタム シャッフル動作用にカスタム Random インスタンスを指定することもできます。

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

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