擲骰子程式

日前有些剛唸大一的小朋友會問 DR 關於寫程式方面的問題,而 DR 往往會建議對方可以參考 DR 在舊網站上所留的程式碼,但這也因此讓 DR 突然回想到,其實當中有一支程式用了效率極差的寫法,為免誤人子弟,DR 決定做點說明,就是那個 Windows 平台上的「猜數字遊戲」(DR's Number Guess),它的效率問題發生在 AI 擲骰的部份,程式內容簡述如下:

  1. 用數字 1 到 9 的骰子去隨機產生 AI 的答案
  2. 若猜錯則將該數字送入排除庫
  3. 再次用數字 1 到 9 的骰子隨機產生 AI 的答案
  4. 比對答案是否與排除庫相符,若相符則回到步驟 3 重新產生

 

看出問題了嗎?如果 9 個數字中已經有 8 個被送入排除庫,程式不會變快,反而變慢,因為它還是用相同的骰子面數。正確的寫法是將猜過的數字直接從骰子中刪除,並重製骰子的面數,比方說第一回是 9 面骰、第二回是 8 面骰,以此類推,而實際程式的概念如下:

  1. 使用數字 1 到 9 的「9 面骰」
  2. 假設擲出 7 這個數字
  3. 略過 7,將 1、2、3、4、5、6、8、9 這 8 個數字重製成「8 面骰 」
  4. 下一回合以此類推

 

後來 DR 寫的「井字遊戲」(DR's Noughts & Crosses)有應用到部份「重製骰」的概念,但 DR 還是在此提供一個最直接的範例供程式初學者參考:

 

這支 C 程式是 DR 好段時間前寫的「隨機分組」範例程式。

分類: