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