> 백엔드 개발 > C++ > LINQ를 사용하여 컬렉션의 하위 집합을 무작위로 섞으려면 어떻게 해야 합니까?

LINQ를 사용하여 컬렉션의 하위 집합을 무작위로 섞으려면 어떻게 해야 합니까?

DDD
풀어 주다: 2025-01-01 08:05:09
원래의
209명이 탐색했습니다.

How Can I Randomly Shuffle a Subset of a Collection Using LINQ?

Fisher-Yates-Durstenfeld를 사용하여 LINQ에서 하위 컬렉션을 무작위로 섞기

대규모 데이터 세트를 처리할 때 주어진 컬렉션에서 특정 크기의 무작위로 섞인 컬렉션을 얻는 것은 다음과 같습니다. 중대한. 이는 무작위 선택 또는 샘플링과 관련된 시나리오에서 일반적으로 발생합니다. 이 문제에 대한 최적의 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿