天天川麻源碼
1. 四川麻將出現天胡與地胡的概率
人在四川過年,免不了上桌打麻將,作為一個標準的麻將新手,上桌送錢是免不了的,當然在這個運七技三的游戲中,本民工居然還偶然有一天贏了一點點錢。
於是這個引起了本民工的好奇,實際上民工本人以前開發過鬥地主外掛,還搞了三個麻將作弊APP還有配套的藍牙硬體,有兩個是用手機控制麻將出牌,有一個是用手機查看桌上所有人手上牌的(原理是用IC麻將牌)。
所以,一定要遠離賭博,珍愛生命!
因為好奇加上正好過年有時間,本民工於是想用實現一個能夠自打麻將的小程序,首先是使用圖像識別的方法獲取出牌和發牌信息,其實模擬按鍵操作出牌,理論這樣種採用圖像識別的外掛是封不了的,因為圖像識別對本民工來說完全不是事兒,大概2007年時間,已經有一樣的方法做了一個自動偷菜外掛。所以難點就只在麻將出牌AI和攻防AI上了,然後先查詢了一下當前麻將AI的現況,好象當前基本是採用「有限狀態機」和 博弈樹alpha-beta 來,實現水平還沒有達到人類頂級高手。當然既然已經有了在圍棋上大殺四方的狗,麻將應該也不遠了,當然狗用的是Deeplearning來做,正好Deeplearning也正好是本民工在玩的東西。所以想嘗試弄一個AI玩一下。但是弄下為,實際情況是…
又掉坑裡了。
首先是想Deeplearning一下,發現沒有樣本!
其次,找了很久,網上也沒有什麼像樣的開源庫可以直接用,好不容易找到一個算和牌(胡牌)的源碼,結果一看,效率低得嚇人。世上一切都是有代價的,計算機的基本代價就是空間與時間,演算法不優化,很多玩法(主要是笨方法)沒得搞。
算了,反正過年閑著,先發明一下輪子吧。
第一步,概率估算。
蒙特卡洛法。本來本民工是想用蒙特卡洛法去生成海量樣本的,然後統計出一些有意思的概率,然後把相關概率形成參數表,供後面的 博弈樹alpha-beta 搜索優化用。
蒙特卡洛法,原理在這里就不表述了,但是這個的確是一個非常非常優秀的搞法,在處理復合概率問題方面,特別適合本民工這樣不喜歡動腦的人。
因此在樣本生成的過程中,一些有意思的數據就出來了。
先看一下地胡的概率。
注意一點: 因為出牌AI還沒有完成,目前還沒有讓程序開始自動對弈,本文給的地胡概率並不準確,這個概率只是上手就有可能胡的概率。
以下是三個數據:
總體大概做了十幾次發牌測試吧,因為每次要大概十分鍾時間,太浪費寶貴時間,還不如多娛樂下別的,所以十幾次也夠了,出現地胡的概率是46W~116W次這樣,抽樣中值位置大約是80萬。
需要說明的這不是一個嚴肅學術研究,只是一個有意思的測試。所以本民工的隨機發牌程序實際是每家發了14張牌。所以真正有地胡的概率是320萬(只有莊家是會起手拿14張牌)。
另外,這個是四川麻將,四川麻將是108張牌,只有萬、條、筒。實際上概率大了很多。
結論就是:打四川麻將地胡的概率是320萬分之一,這個概率… 比摸百萬大獎還要難。簡單算了一下,平均一天打10場麻將,大概平均要876年可能搞得上一次地胡。
好了地胡概率算出來了。下面是天胡。
不好意思天胡概率,還沒有算出來。
本民工做了大概率四次每次3000萬的抽樣(每次要搞4個小時左右,太浪費時間),抽樣樣本是1.2億次,因為只有莊家有條件天胡,所以實際是抽樣4.8億次沒有出現一次天胡。
所以本民工算是明白了,為什麼傳說中會有老頭摸到天胡,激動得那個…,這個概率真是太低了。因為這個概率本民工現在也沒有算出來,現在還不敢亂說,那天把發牌和計和程序改成並發後,找台電腦讓他去瞎算吧。
但是不論是地胡還是天胡它的實際概率,怎麼說呢?遠比本民工想像的要低非常多,因為我身邊出現過兩次,打牌時朋友和我說他的牌是摸了一張就上聽,雖然沒有地胡上,但實際上320萬分之一這個就是四川麻將摸牌上聽的概率。我怎麼可能有這么好運氣呢?當然需要說明的是,從小到大我沒有聽說身邊有人地胡過,也許是身邊沒有人打作弊麻將吧。
另外,再分享一下,一個有意思的概率。
就是起手有一個對加上3副牌(含兩個對)的概率,同時還缺了一門牌的概率,大概是6萬分之一。平均一天打10場麻將,大概16年能搞得上來一次。這個似乎比較平民化,打麻將的人人都有機會,不過似乎也比我想像的要低。本民是不是應該檢查一下演算法的問題了?
說到最後,放個彩彈。
不知道大家沒有仔細看圖,實際上本民工已經隨機抽樣出來了天胡牌。請仔細看數據圖2。因為只出現了一次,所以沒有形成統計樣本。