首页 > 后端开发 > 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 扩展方法:

下面是一个 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板