人在四川过年,免不了上桌打麻将,作为一个标准的麻将新手,上桌送钱是免不了的,当然在这个运七技三的游戏中,本民工居然还偶然有一天赢了一点点钱。
于是这个引起了本民工的好奇,实际上民工本人以前开发过斗地主外挂,还搞了三个麻将作弊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。因为只出现了一次,所以没有形成统计样本。