过年打麻将,只要掌握这点概率学原理,你能多胡好几盘

liftword3周前 (02-08)技术文章15

特别声明:本文为新华网客户端新媒体平台“新华号”账号作者上传并发布,仅代表作者观点,不代表新华号的立场及观点。新华号仅提供信息发布平台。

明天就是除夕了,春节就在眼前,独乐乐不如众乐乐。

如果要选择一种声音代表新春佳节的团聚,除了噼里啪啦的鞭炮、杯盏相碰的清脆,一句“三缺一”和麻将桌上哗啦啦的搓麻声必定占有一席之地。

麻将是一场概率游戏和策略博弈。

19世纪的麻将牌长这样(图源:Wiki)

故事还要从【清一色】讲起。

先补充点背景知识。标准麻将牌包含“筒”、“条”、“万”、“风”和“箭”五套花色,每种牌有4张是相同的。4名玩家初始摸得13张牌,之后按照逆时针摸一张牌再打出一张牌,直到他摸到最后一张牌,14张牌可以凑成23333的排列组合,即为胡牌。

从上到下分别为“筒”、“条”、“万”(图源:Wiki)

用公式表示就是:m*AAA+n*ABC+DD。m,n可以为0(理科生的脑回路真奇妙)

如果最终胡牌的牌面为同一花色,就叫清一色。

一个叫李志光的数学家发现了一种有趣的牌形。

好牌(图源:Mathematical aspects of the combinatorial game “Mahjong”)

仔细看,你会发现下一张只要摸到的也是筒,不管是一筒到九筒中的哪一张,都可以胡牌。这牌,只要一推倒,众人定有不明觉厉之感。

至此开始,一个娱乐问题成功上升为科研课题,行话叫“k门问题”。

用数学符号代表刚才的牌形,那就是X1X1X1X2X3X4X5X6X7X8X9X9

计算概率,大体的思路就是:尝试所有Xi的组合,然后检验每种组合是否符合k门的要求。这样的重复性运算,交给Python程序就够了

一段源代码截图

结果是这样的。

这个问题很实用了,理解了其中奥义,你也能拥有牌局的大局观。来看看他们是怎么算的。

首先需要用数学语言定义每一种牌形。他们选择了一对数字(c, n),c表示花色,0为条、1为万,2为筒;n表示具体的数字。比如(0, 3)就是三条,(1, 5)就是五万。

(2,7)和(2,5) 图源:flicker

接下来设置一段数列V,即14个(c,n)的集合,用来表示完整的牌面。这时你就可以用逻辑语言定义出胡牌(complete)的条件。最后一步是设计一个变量,定量地表示牌面的好坏。研究者引入了“缺牌数”的定义,也就是距离运算到胡牌状态,还差几张牌。

接下来的运算结果请收好,这是一份科学的打牌秘籍。(过年发财就靠它了)

基础版——清一色

1、如果你已经凑出了两个“3连”(包括刻子和顺子),且它们不连续,那么缺牌数小于等于2;

2、如果你的牌面是以下两种情况之一,那么缺牌数为3

5个对子+一个杠;

5个对子+1个刻子+1张单牌

进阶版——多花色

1、对于任意组合的一副牌,最大缺牌数为6。要置换6张牌才能胡的牌面就是最烂的牌;

2、如果你的牌面是以下3种情况之一,那么缺牌数小于等于5

两个不连续的“3连”(包括刻子和顺子);

一个“3连”和一个“准3连”(只需要碰一下或者吃一个就能凑出刻子或顺子);

4个“准3连”

面对具体的牌面时,置换麻将牌的方案不止一种,此时需综合考虑缺牌数和胡牌成本,以及方案的可行性。

举个栗子,如果你的牌面是这样的,那么你可以考虑3种搭配方案:

先把牌码上,看起来顺眼一些。

还有研究证实,麻将的益智作用有益于阿尔茨海默病患者。(多打麻将好处多)

当然,专业的科学家费劲编写程序来还原麻将的游戏规则,初衷倒不是为各位玩家搞一套打牌指南,而是为了开发人工智能。毕竟围棋高手阿尔法狗和阿尔法零相继横空出世,麻将高手机器人也指日可待。

问:图中有几个人在打麻将(图源:unsplash)

各位麻将高手,你期待和机器人PK的那天吗?

参考资料:

2.Sanjiang Li , Xueqing Yan. Let’s Play Mahjong! arXiv:1903.03294v1

《万物》杂志致力于为中国青少年家庭奉献最完整、权威的科普知识图谱!

内容横跨七大学科,涵盖环境生态、工程机械、太空探索、物理化学、历史人文、生物医学等方方面面,将完整的、前沿的科技新知整合为有趣的、有逻辑链的故事。

形成的知识图谱,方便孩子消化理解,并转化为长期记忆,几乎可以对标中学课程中的所有理工科目知识点。

我们还用思维导图、阅读书单、科学课程以及多媒体等多种方式,让孩子产生持续探究的动力,形成更完整的知识体系。

好啦,就让我们在新的一年里,共同感受科学的魅力,用好奇心点亮世界!

《万物》,献给对世界好奇的你!

撰文 | 比邻星

来源:新华号 万物杂志

相关文章

概率分布与编程:二项式分布、泊松分布的原理,Python3如何实现

在说二项式分布之前,先来复习一下排列组合的概念,尤其是组合(Combination) C。排列的定义:从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个不同的元素按照一定的顺序排成一列,叫做...

Python 循环的高阶写法:简洁与高效的代码技巧

在 Python 中,循环的高阶写法通常借助一些内置函数、生成器表达式以及高级的库,能够让代码更加简洁、优雅。以下是几种常见的高阶写法:1. 列表推导式(List Comprehension)列表推导...

先Mark后用!8分钟读懂 Python 性能优化

从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...

Python常用算法学习(7) 动态规划,回溯法(原理+代码)-最全总结

引言:从斐波那契数列看动态规划  斐波那契数列:Fn = Fn-1 + Fn-2 ( n = 1,2 fib(1) = fib(2) = 1)练习:使用递归和非递归的方法来求解斐波那契数列的第 n 项...

按照概率学原理,你这牌一看就胡不了

撰文 比邻星春节假期,独乐乐不如众乐乐。如果要选择一种声音代表新春佳节的团聚,除了噼里啪啦的鞭炮、杯盏相碰的清脆,一句“三缺一”和麻将桌上哗啦啦的搓麻声必定占有一席之地。麻将在不同段位的玩家眼中代表着...

原理 + 代码|手把手教你用Python实现智能推荐算法

推荐系统将成为未来十年里最重要的变革,社会化网站将由推荐系统所驱动。 --- John Riedl明尼苏达大学教授前言智能推荐和泛的营销完全不同,后者是将产品卖给客户作为最终目标;而智能推荐是以“客户...