高點研究所
首頁商研所許誠哲 R語言應用:以Monte Carlo模擬估算10點半遊戲過五關機率
篇名
R語言應用:以Monte Carlo模擬估算10點半遊戲過五關機率
作者
許誠哲
說明
發佈時間:20210906

在上一回的 R 語言應用專欄中, 我介紹了當以排列組合計算古典機率較不易時, 可以利用Monte Carlo 模擬作為機率的估算。在本次的專欄中, 我將介紹一個許多人在兒時與家人常玩的撲克牌遊戲: 「10 點半」。
10 點半的遊戲方法相當簡單, 使用的是一副完整的 52 張撲克牌。其中 J、Q、K 計為半點, A 計為 1 點, 而 2 至 10 則以牌面點數計算。而規則上是莊家與玩家各發一張牌(稱作底牌), 莊家的點數與玩家的底牌會隱藏起來。而玩家可以選擇補牌, 增加自己的點數, 但若點數超過 10 點半(稱作爆掉), 則下注的金額則為莊家所有。其中補牌的點數是會顯現出來的。但若玩家決定不再補牌, 莊家可以決定是否要與玩家直接比點數 (雖然補牌的點數已知, 但玩家底牌未知)或者補牌後再比點數, 點數較高者獲勝。

由於玩家先補牌時會承擔先爆掉的風險, 因此這個遊戲看起來對玩家較有利。但為了增加玩家遊玩的意願, 因此有兩種特殊的牌型: 「10 點半」 與 「過五關」, 莊家需給予高倍率的賠注。10 點半即為玩家的點數剛好為 10 點半且莊家的點數低於 10 點半, 則莊家應給予 2 倍的賠注。過五關顧名思義, 即玩家手上五張牌 (含底牌) 的點數和未超過 10 點半, 通常會給予 5 倍的賠注。而另一種更為夢幻的牌型, 玩家手上五張牌的點數和正好為10 點半, 通常會給予10 倍的賠注。以上的賠率並沒有一定, 可以由玩家與莊家之間互相協調。由於遊戲時通常會輪流作莊, 因此整體來說是公平的。

在此我想要估算此遊戲過五關或者過五關且 10 點半的機率。由於補牌時, 通常接近10 點半時玩家就不太會補牌, 且 10 點半的賠率並不高, 因此計算10 點半的機率不太現實。但由於 10 點半的賠率較高, 因此可能會吸引玩家願意冒著爆掉的風險補牌。因此我假定玩家只要沒有爆掉, 就一定補牌, 計算過五關的機率。但實際上過五關的機率一定較低, 因為若第三或四張牌的點數和已經超過 9 點, 顯少有玩家會選擇補牌。

程式碼請參見圖 1。

在撰寫程式時要特別注意, 應採取抽出不放回的方式, 意即發出去的點數需扣除該張牌在進行抽樣。此外, 一個比較簡潔的寫法是直接抽五張牌計算點數和。但這個方法只能計算純過五關的機率, 無法考慮各種策略對於勝率的影響。因此我仍採用一張一張補牌的方式撰寫程式。我進行了 1 億次的模擬, 其中過五關(點數和小於 10 點半)發生了 5561671 次, 過五關又 10 點半發生了 935748 次。因此可大略估計得知若採取不缺錢的瘋狂補牌法, 過五關的機率約為 5.56%, 過五關 10 點半的機率為 0.94%, 發生的機率並不高。

最後, 我們可以將本次的遊戲作為撰寫程式的基礎。在下次的 R 語言應用專欄中, 我將會介紹一個規則與玩法類似, 但更廣為流傳的賭場遊戲 「21 點」。

關鍵詞
Monte Carlo、撲克牌遊戲、底牌
刊名
商研所許誠哲