移至主內容
DarkRanger's Secret Area

主導覽

  • 首頁
  • 關於本站
  • Linux
  • 程式開發
  • N900
  • 譯文
  • 資訊技術辭典

文章分類

  • 影劇
  • 遊戲
  • 筆記
  • 雜文
  • 資訊技術
  • 站務訊息

最新內容

  • I use zip bombs to protect my server
  • Iconography of the PuTTY tools
  • Fedora 42 安裝 OpenSSL 1.1
  • 關於本站改版的其它替代方案
  • 半途而廢的未破台單機遊戲列表
  • The Big Picture (1997)
  • How-To:Linux 安裝 DevilutionX
  • 於 2012 年建立的一份音樂播放清單
  • How-To:Linux 安裝 Medal of Honor: Allied Assault
  • Fallout 4 (2015)

擲骰子程式

發表日期:星期二, 12/06/2011 - 13:59,更新日期:星期日, 06/28/2015 - 13:20

日前有些剛唸大一的小朋友會問 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 還是在此提供一個最直接的範例供程式初學者參考:

  • main.c

 

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

筆記