C#의 카드 섞기
일반적인 프로그래밍 연습에는 특정 언어로 카드 섞기 시뮬레이션을 작성하는 작업이 포함됩니다. 이 질문은 카드 한 벌을 섞고 사용자에게 섞은 횟수를 쿼리하는 방법을 탐구합니다.
문제 설명
제공된 코드에는 데크, 카드 및 카드에 대한 클래스가 포함됩니다. 초기 카드 순서를 표시하고 셔플 횟수에 대한 사용자 입력을 받는 프로그램과 함께 슈트입니다. 문제는 셔플링 메커니즘을 구현하는 데 있습니다.
해결책
Knuth 셔플이라고도 알려진 Fisher-Yates 셔플은 배열 셔플링에 널리 사용되는 알고리즘입니다. 제자리에. 업데이트된 코드에는 다음 알고리즘이 통합되어 있습니다.
static public class FisherYates<br>{</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">static Random r = new Random();
static public void Shuffle(Card[] Deck)</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">{ for (int n = deck.Length - 1; n > 0; --n) { int k = r.Next(n+1); Card temp = deck[n]; deck[n] = deck[k]; deck[k] = temp; } }
}
이 클래스는 카드 배열을 다음과 같이 사용하는 정적 메서드인 Shuffle을 정의합니다. 입력. 그런 다음 덱을 역순으로 반복하여 현재 카드와 교체할 무작위 카드를 선택합니다. 전체 데크를 반복함으로써 알고리즘은 철저한 혼합을 보장합니다.
구현
셔플을 원본 코드에 통합하려면 다음에서 Shuffle 메서드 호출을 추가하세요. 사용자로부터 셔플 횟수를 얻은 후 Program 클래스의 기본 메서드:
Deck myDeck = 새로운 덱(); // 새 덱 생성<br>int numShuffles = Int32.Parse(Console.ReadLine()); // 원하는 셔플에 대한 사용자 입력 읽기<br>FisherYates.Shuffle(myDeck.Cards); // 원하는 횟수만큼 덱을 섞습니다<br>foreach(myDeck.Cards의 카드 c) // 셔플된 덱을 인쇄합니다<br>{</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">Console.WriteLine(c);
}
결론
Fisher-Yates 셔플 알고리즘은 카드 데크의 효율적인 셔플링을 허용하고 사용자가 지정한 셔플 카운트 요구 사항을 충족합니다. 코드는 요청에 따라 셔플된 데크를 출력합니다.
위 내용은 사용자가 지정한 셔플을 기반으로 C#에서 카드 덱을 효율적으로 셔플하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!