제네릭의 제네릭 목록의 무작위 분류
일반 목록 (예 : 디지털 목록)의 무작위 정렬은 프로그래밍에서 일반적인 작업입니다. C#에는 구축 된 -in 메소드, 확장 방법 및 세 번째 파티 라이브러리를 사용 하여이 목적을 달성 할 수있는 여러 가지 방법이 있습니다. 최상의 성능과 정확성을 얻으려면 최상의 방법과 한계를 이해하는 것이 필수적입니다.
Fisher-Yates 셔플 확장 방법
가장 일반적으로 사용되는 방법 중 하나는 Fisher-Yates를 사용하여 알고리즘을 셔플하는 것입니다. 이 방법은 임의의 인덱스로 요소를 반복함으로써 Ilist
의 요소를 무작위로 방해합니다. 다음 코드 블록은 Fisher-Yates 알고리즘을 구현하는 확장 방법을 보여줍니다.
이 확장 방법을 사용하려면 ilist 의 Shuffle ()을 호출하십시오. 예를 들면 :
시스템을 사용하여 무작위성을 향상시키기 위해 Cryptography를 사용하십시오
System.random은 편리하지만 항상 충분한 무작위성을 제공하는 것은 아닙니다. 더 높은 품질의 임의성이 필요한 경우 System.security. Cryptography 라이브러리는 안전한 임의 번호 생성기를 제공합니다 :
성능 고려 사항 및 스레드 보안의 중요성
System.random 클래스 첫 번째 예제에 사용되는 클래스는 스레드 -Safe가 아닙니다. 즉, 여러 스레드가 동일한 시스템에 액세스하려고하면 동시에 인스턴스 인스턴스가 동시에 잘못된 결과가 발생할 수 있습니다. 이 문제를 해결하기 위해 ThreadSafrandom 클래스는 로컬 랜덤 번호 생성기를 사용하여 스레드 보안 솔루션을 제공합니다. Multi -Streaded 환경에서 정확성을 보장하기 위해 ResdleSaferantom의 수정 된 Shuffle () 확장 방법.
결론
무작위 제네릭 목록에서 개발자는 System.random (편의를 위해) 또는 System.security.cryptography (더 나은 임의성)를 사용하여 선택할 수 있습니다. 또한 ThreadSaferandom 클래스는 다중 스레드 애플리케이션의 스레드 보안을 보장합니다. 특정 방법은 필요한 임의성 및 성능 고려 사항에 따라 다릅니다. <code class="language-csharp">private static Random rng = new Random();
public static void Shuffle<T>(this IList<T> list)
{
int n = list.Count;
while (n > 1)
{
n--;
int k = rng.Next(n + 1);
T value = list[k];
list[k] = list[n];
list[n] = value;
}
}</code>
로그인 후 복사
위 내용은 C#에서 일반 목록을 효율적이고 안전하게 무작위로 셔플하려면 어떻게해야합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!