>백엔드 개발 >C++ >LINQ를 사용하여 컬렉션에서 무작위 하위 집합을 효율적으로 가져올 수 있습니까?

LINQ를 사용하여 컬렉션에서 무작위 하위 집합을 효율적으로 가져올 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-31 20:01:14896검색

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- 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.