C# 中的洗牌
常見的程式設計練習涉及用給定語言編寫洗牌模擬。此問題探討洗牌一副牌並詢問使用者洗牌的次數。
問題陳述
提供的代碼包括一副牌、牌和牌的類套裝,以及一個顯示初始紙牌順序並接受用戶輸入洗牌次數的程序。挑戰在於實現混洗機制。
解
Fisher-Yates shuffle,也稱為 Knuth shuffle,是一種廣泛使用的陣列混洗演算法就位。更新後的程式碼合併了以下演算法:
static public class FisherYates<br>{<pre class="brush:php;toolbar:false">static Random r = new Random();
; static public void Shuffle(Card[] Deck)<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 合併到原始程式碼中,請在以下程式碼中新增對Shuffle 方法的呼叫從使用者取得洗牌次數後的Program類的Main方法:
Deck myDeck =新甲板(); //建立一個新牌組<br>int numShuffles = Int32.Parse(Console.ReadLine()); // 讀取所需洗牌的使用者輸入<br>FisherYates.Shuffle(myDeck.Cards); // 將牌組洗牌所需的次數<br>foreach (Card c in myDeck.Cards) //印洗牌後的牌組<br>{<pre class="brush:php;toolbar:false">Console.WriteLine(c);
}
結論
Fisher-Yates 洗牌演算法可實現紙牌的高效洗牌,並符合使用者指定洗牌次數的要求。程式碼依照要求輸出洗牌後的牌組。
以上是如何在 C# 中根據使用者指定的洗牌方式有效地洗一副牌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!