首頁 >後端開發 >C++ >如何使用 LINQ 從集合中高效率取得隨機子集?

如何使用 LINQ 從集合中高效率取得隨機子集?

Susan Sarandon
Susan Sarandon原創
2024-12-31 20:01:14906瀏覽

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 擴充方法:

以下是一個 LINQ 友善的擴充方法,它實作了 Fisher-與 IEnumerable 一起使用的 Yates-Durstenfeld shuffle集合:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn