对【巴洛塔】使用「概率统计」吧!

0 点赞
Balatro
转载

通过概率分析以及模拟频率近似,探究以全力凹出某牌型为目标,刷牌(通过弃牌和出牌置换手牌)的最优策略。 引入 假设你在玩星云牌,已经有了20级的顺子,外加一些贴了乘算增益的小丑,什么出牌、弃牌都只是你用来刷出顺子的工具罢了,打顺子真是顺得不得了——直到底注8的大boss,你经过一番敬小慎微的操作,终于打出了一个又一个又一个又一个的高牌,成功失败。 好吧,也许你必须得接受这一切,然后祈祷重开的下把能少刷几次开局;但也许你也会愤愤不平,为什么一直以来都做的好好的,关键时刻就做不出来,是我刷牌的策略出了问题?还是这破顺子本身就难做?这些就是本文试图使用【概率统计】回答的问题。 基本问题 本文仅从很小的一方面切入,对各个基础牌型(共9种)试图回答这样一个问题:以全力凹出某牌型为目标,刷牌(通过弃牌和出牌置换手牌)的最优策略。 限于笔者本身的能力,内容可能会有缺陷与疏漏,也许也并不能达到“最优策略”,欢迎交流与指正。

基本模型 一、等牌模型 当牌堆剩余【剩余牌量】的总牌量,目标重复牌【重复牌】个时,摸x张牌,获得目标牌数量为【获得牌数】的概率为

其中C(n,k)表示从n个不同的元素中取出k个元素的不同组合的个数。 如何理解?前两项相乘,计算出摸x张牌时包含正好gets张目标牌的全部可能情况,而所有情况都是等可能的,除以摸x张可能得到的全部组合数,就得到相应情形的具体概率。 现在让我们先随便取两个情景熟悉一下这个模型。 标准初始套牌,4出牌|2弃牌,手牌上限8,你初始摸到4张同色,真是不得了,你决定保留这4张抛开一切全力开刷同花!你的体验告诉你几乎随便一两下就能出同花,将以下参数 reminds=52-8;duplicates=13-4;x={1*4,2*4,3*4,4*4,5*4};gets=0; 带入即可得到刷1~5次后,仍没做出同花的概率为 {0.385706,0.如果你喜欢以0.05作为不可能事件的标准,那么你可以认为,基本上刷完三下怎么也能出了,全刷完还做不出来的概率真是小的不得了。 虽然前述情景确实很爽,体感上似乎经常有,又好像不是那么频繁,但到底是多频繁呢,我们可以带入以下参数计算 reminds=52;duplicates=13;x=8;gets=4; 得到的概率约为0.078,当然,这只是指定某花色时的概率,现在我们不在乎做什么花色的同花,乘4才差不多就是我们想要的结果:0.31,你也可以近似取1/3来感受。 什么,你说咱少考虑了初始8张同时出现两种4同色的配牌!你遇到过吗就说咱少考虑!这个概率实在太低,考虑后保留到两位有效数字结果都一样,读者有兴趣可以自行推算。 二,等牌+模型 别问我什么是+,你是不是没去完成成就 从一系列重复数分别为a₁,a₂,…,aᵢ,…的牌中,取出z张(z=b₁+b₂+…+bᵢ+…),得到目标重复数分别为b₁,b₂,…,bᵢ,…的概率为

这个模型主要是用来解决有效牌重复的问题,比如说我已经有1、3、5三张牌,想做顺子,缺2、4共8张牌,但用等牌模型却没办法直接计算,因为2、4是属性不同的目标牌,做出顺子必须需要各来一张,不能简单地认为就等随便2张目标牌。那怎么办?具体问题具体分析,所以我们直接抛弃等牌模型,回归基本原理算?太过可惜,不如联合使用等牌+模型吧。 对于标准初始套牌,4出牌,2弃牌,手牌上限8,初始摸到1、3、5三张牌,欲图做顺子12345。设置参数 reminds = 52-8; duplicates = 8; x = {1*5,2*5,3*5,4*5,5*5}; gets = {0,1,2,3,4}; 当get = 0、1时,确实无法组成顺子,但当gets = 2时,仍需摸到两张2或两张4才无法组成顺子,这里我们设置等牌+模型的参数 a = {4,4}; b22 = {2,0}; b42 = {0,2} 这里b22表示摸到两张2,b42表示摸到两张4,在此场景下,概率p^+_{22}=p^+_{42}(右上角标+用于区分等牌和等牌+模型计算出的概率),分开列举只是为了更方便读者想象一般场景。由于平台不支持内嵌公式功能,只能以tex码表示,对此给未接触过tex的读者带来的不便深表歉意。 gets = 3、4时同理,当gets = 5时,则无论如何都可以组成顺子了。 最终我们得到式子

带入具体数据就可以得到此时刷 1~5 仍然做不出顺子的概率 {0.864657, 0.580808, 0.325702, 0.152402, 0.0566781} 是不是有点难以置信?你此时就算全力刷完也达不到 0.05 不可能事件的门槛,如果遇到扣光你出牌或弃牌次数的 boss 就更无还手之力了。 注:等牌模型可以看作等牌+模型的特殊情况,令 a_1 = duplicates, a_2 = reminds - duplicates,b_1 = gets,b_2 = x-gets 即可得到前者,说人话就是给牌分类为 目标牌 和 非目标牌,然后计算分别的摸牌数。本节的问题可以直接使用等牌+模型得到非常漂亮的解决形式(分类 目标牌 A、目标牌 B、非目标牌),但笔者一开始确实没想到,若有兴趣欢迎读者自行推导,笔者不再给出。 随机模拟 2024年了,还在搞传统概率统计,搞得对不对不还得靠编程验证?理论太复杂的话你倒不如直接使用模拟频率得了! 基本思路如下:用 0~ 51 对基础牌编号,花色信息隐藏在除以 13 后的商里,点数信息隐藏在余数里(点数为1~13,余数为 0~12,对余数 +1 使它们一一对应),摸入几张就是从中不重复选出一定的数字。 假如牌堆中混了一张万能,就给他一个独特的编号: 4*13+Rank(点数)-1,对于花色,只需统计各个花色的数量即可,一旦含万能,就把它的数量同时添加给所有基本花色的统计数;对于点数,有两种统计对象:1.想做两对、三条、四条等牌型,与花色一样,统计各点数数量即可;2. 想做顺子,那么重要的是某种模式,比如:{x,x+1,x+2} 是否出现了,模式可以提前设定好,只是需要额外注意 x 的取值,以模式 {x,x+1,x+2} 来举例说明,牌型 123, 234, 345 其实是三类模式,这是因为牌型 QK123、K1234 并不允许,做牌效率上 123 < 234 < 345。 如果你想做同花顺这样同时要求花色与点数的大牌,上一段就显得多余了,不过对于这类大牌,由于很多复合概率极低,都可以忽略,直接使用前述理论计算更加简便。 以下是使用 Mathematica 对等牌模型中情景2,也就是初始摸到 4 张任意同色概率的模拟 Shuffle[handsize_, pattens_, cards_ : Range[0, 51]] := Block[ {ini, colors, ranks, countedColors, countedRanks}, ini = RandomSample[cards, handsize]; colors = Floor[ini/13]; ranks = Mod[ini, 13]; countedColors = (Delete[#, {-1}] + #[[5]] &)@(Count[colors, #] & /@ Range[0, 4]); countedRanks = Count[ranks, #] & /@ Range[0, 12]; {countedColors, countedRanks, 0 != Plus @@ ((Times @@ countedRanks[[# + 1]]) & /@ pattens) } ]; t = 0; n = 100000; Do[If[Max@Shuffle[8, {{0, 1, 2}}][[1]] == 4, t += 1], n]; t/n*1. 运行结果为总在 0.31 左右波动,与理论预期一致,证明整套思路应当没什么大问题。 我们还可以直接使用随机数模拟,估计至少出现 135 这样“两崁型” 出现的概率(我没有想到比较明了简洁的计算精确值方法) (* 135,246,...,10QA *) pats = (Mod[#, 13] &)@({#, # + 2, # + 4} & /@ Range[0, 9]) t = 0; n = 100000; Do[If[Shuffle[8, pats][[3]], t += 1], n]; t/n*1. 运行结果总在 0.62 左右波动。 牌型与策略 0. 通用分析 常常的抉择点在于:受手牌上限的限制,我们不知道是应该保留一定牌型,听更多牌,还是应该拆掉几张,用来刷更多牌。这里先通用性地给出一个好用的判断方法。 假设现在剩余 N 张牌堆中有 m 张是有效牌(在当前手牌基础上,单张就对做出目标牌型有直接推进作用的牌),但是如果要保持 m 张牌有效,我必须持有一些特定牌,这使得我的最大刷牌数 ν 有 0<ν<5(否则根本没有分析的必要),为了摸更多的牌,我可以拆掉 µ 张特定牌,但是有效牌数也将减少 n,在什么情况下,拆牌是更好的?(简单认为通过本次刷牌,使获得至少一张有效牌概率最大为最优策略) 在选择保持牌时,至少获得一张有效牌的概率为

拆牌更有利于应对

设置 N = 20、25、30、35、40、45; m = 2到20的整数; ν = {1,2,3,4}; μ = {1,2,3,4}; 接着让n从0递增,试探增到何时G_P < 0不成立,然后给出值n_0,这意味着:如果拆μ张牌后,有效牌数损失大于等于n_0,就不如不拆。此外,还应注意v+μ > 5时无意义。 下面为一些特定取值下n_0的一览表:第一行标注N = 20、25…45;第二行标注ν=1、2、3、4;第一列标注m = 2、3…20;每一个小方格内,从左到右依次有μ=1、2、3、4,有时不足4个,一是略去了v+μ > 5的情形、二是穷举的参数过于刁钻,使得原本就一定能获得有效牌(n_0 = 0),拆牌去多刷那几张无意义了。

观察上表容易得知一些信息:剩余牌量N对n₀的影响较弱,对照仅N增加5或减少5的各n₀,其数值很多时候并无变化,有变化基本也就是增减1,所以对N取大间隙是足够反映多数情形的;可以认为,牌堆有效牌m≤5,且保留时的刷牌上限ν=3、4时,多摸一张牌与多听一张牌价值相当(前者价值往往偏低);当牌堆有效牌6≤m≤10,且保留时的刷牌上限ν=3、4时,多摸一张牌与多听两张价值相当(前者价值往往偏低);当ν=4时,括号内判断绝对;额外提及一下,这里的决策判断还建立在一个关键假定上:你的目标牌型不太可能光凭刷牌刷出来,或者一次刷出多张关键牌完成(比如3457一次刷出12完成顺子。否则刷牌价值会更高,只讨论有效牌可能会造成一定的判断偏差(更保守一些)。 后注:但是哪怕对最容易刷出来的对子,通用分析的结果离最优决策偏差也很小(似乎把放弃拆牌的条件由大于等于n_0修改为大于n_0就符合得很好了)。啥都可以套!读者可以通过使用通用分析,比对后文对子、两对模块中的模拟结果来感觉这一点。 下面是一个简单应用,以便读者熟悉:

这把做顺子,顺子已经10级了,图中手牌离顺子只缺3或7。不过,同时听3和7需要保留24568,只能刷三张牌;单听7则可以多摸一张,该如何抉择呢? 注意到有效牌总数m=8,直接套用前述结论:多摸一张与多听两张价值相当,此时听3可以听三张,所以选择保留24568。 或者你也可以在表中寻找N=30、m=8、ν=3、µ=1时的n₀值,容易得到n₀=2,这意味着拆牌后,有效牌损失大于等于2,就应该放弃拆牌,故保留24568。 1. 高牌 没什么可说的,保底牌型。 2. 对子 调整手牌上限,初始拥有对子的模拟频率:

图中黄线为标准牌组,蓝线为废弃牌组(少12张人头牌),后文如未加额外说明则默认如此。 假如初始没摸到对子,全是单牌,刷1张牌听的最多,但摸得最少,刷5张牌则与之正相反,而且刷得越多,还更可能摸出新对子。所以到底一次该刷几张牌,才能使获得对子的可能性最大呢?以手牌上限8时为例,模拟结果给出

直接全刷了才是对的!(仅适用于初始快速做出对子,后续不一定对,不过分析太麻烦,鸽了) 3. 三条 初始三条

做三条的策略如下: 1. 没对子时,刷5张牌,至少先刷出对子; 2. 有一个对子时,保留该对子,刷其他牌; 3. 有两对时,通常保留两对,刷其他牌; 4. 有时保留三对及以上。 第3、4条策略是否实施,取决于套用通用表后是否值得。 在手牌上限为8的情况下,保留两对会导致少摸一张牌。假设为标准牌,初始获得两对,有效牌为4张,刷牌上限为4张。通用分析显示:多摸一张牌的价值低于多听一张牌,因此此时应保留两对——这也意味着大多数时候都该保留两对。 由于两对很容易做出,这里绘制了初始拿到两对后,再刷x张牌拥有三条的概率作为参考。

4. 四条 初始四条

大概率你是没办法直接拿到四条了。 下面这张很炫酷的图,描述了在52张牌中含有4~10张特定点数牌时,累积刷牌(包括初始配牌)0~50张后,至少刷出四条该特定点数的概率。似乎没什么好分析的,也没什么对应策略,谁又不知道做四条、五条要多复制牌、多滤牌、多摸牌呢,只是运气或许不允许,画这张图单纯只是因为我想画出来看看(理直气壮)。

5. 两对 初始两对:

可以看到,初始牌上限8恰位于曲线的拐点附近,这意味着增加或减少手牌上限对能否初始获得两对的影响相当大。 两对可以视为一对的进阶牌型,没有一对时优先凑出一对,有一对之后,刷几张牌才是最优呢?下面以手牌上限8、初始有对子为例进行分析。

这与刷对子时是一致的——可以认为只是更加压缩了手牌上限而已。此外,刷4张和刷5张差距已经很微乎其微了,为了保留某些特殊牌,刷4张也完全合理。 6. 葫芦 初始葫芦:

(更新:才发现之前画本图代码的参数忘记改了,得出了一些荒谬的结论,希望大家当无事发生:) 刷牌策略基本与三条重合,除了直接摸出三条等一对,但这种情况很少见,此处不再浪费笔墨。 7. 同花 引用自沃兹基:同花,我的生命之光,我的欲望之火,我的罪恶,我的灵魂。 初始同花

这是唯一废弃牌比不过标准牌的牌型(不过真要做同花,谁也比不过方格牌就是了) 关于做同花,似乎没有什么可说的策略,这是因为它起点太高了:哪怕你是标准牌,手牌上限8,初始也有约0.95的概率获得至少一类3同色,更有约0.38的概率获得至少4同色,就算遇到需要决策的时候——比如3红桃、3黑桃、3杂色,是否保留3黑桃或3红桃——用通用表也能快速解决。 8. 顺子 初始顺子:

关于做顺子,获得【捷径】和【四指】这两张小丑牌比什么策略都好,但没刷到才是常态,这时又该怎么做呢?不做顺子就好了(不是)。后文仅讨论一些牌型之间的价值比较,这完全是麻将的方法,也可以启发拥有上述特殊小丑牌时刷牌的策略。为什么呢?因为做顺子太麻烦,我都懒得去分析破数字了!后文会套用一些日麻名词,但到底是不同的游戏,虽然内涵相近,可描述对象并不完全一致。 后注:以下比较分析实际用到的机会还没通用分析多,部分表达有些绕,不好懂,读者完全可以跳过,不删只是觉得写了这么多,删了可惜。四张型(差一张形成顺子) 两面:例如2345、3456;属于最优型 边张:1234、JQKA;属于最差型 嵌张:例如1345、1245、1235 有效牌种类方面:两面(2种)>嵌张(1种)=边张(1种) 但需要注意,部分嵌张,比如1345可以通过进6改良为两面,因此优先级为:两面>嵌张≥边张(嵌张内部分类较复杂,暂不细分,部分嵌张如1235、2346几乎无法改良,价值与边张相近,故取等号) 三张型(差两张形成顺子) 此处不再对牌型命名,仅说明比较优劣的一般方法: 有效牌种类/数量:例如345的有效牌有1、2、6、7共4种;346的有效牌只有2、5、7;347的有效牌则只有5、6,因此优先级为345>346>347。是否更容易形成两面:此条必须结合实际牌库余量来使用(当然不管哪一条实际运用时都需如此),因为不存在天然(假定牌库内各类有效牌余量相同)A比B更容易形成两面且有效牌种类A=B的两组牌型;是否更容易形成易改良嵌张(进一张就能改良为两面):例如对于234和7810,有效牌都有3种,且都有相同概率(1/3)形成两面,但234其他时候要么成为边张1234,要么成为难改良的嵌张2346,而7810能成为易改良的嵌张67810(进5),所以7810>234;自身是否可改良为345、456等。以10JQ的形式为例:比如145和9JK,有效牌都有2种,且都有1/2概率成为易改良嵌张,但是145还可以通过进6改良为456,所以145>9JK。 判断优先级:有效牌种类/数量>更容易成为两面>更容易成为易改良嵌张>自身可改良。 最后,四张型>三张型是无需多言的。 9. 同花顺 同高牌一样没什么可说的,初始默认摸不到一定是对的;启动阶段可以将顺子的一套决策方法搬过来;偶尔赌一赌可以,没有摸完牌库的底气不要玩这个;个人感觉也就废弃牌能玩一玩,格子牌都不好玩。话说格子不玩同花是干什么啦。 参考:脑海中残存不多的概统课程残渣。关键代码 使用 Mathematica 14,后面只给出了模型和通用分析两个部分的代码,随机模拟的代码在相应模块中已经给出,其他各个牌型内概率图的生成代码就算了,太长了,显得文章一半以上都是代码框。 a = #1!/(#1 - #2)! &; c = a[#1, #2]/a[#2, #2] &; (* 等牌模型*) p[reminds_, duplicates_, x_, gets_] := c[duplicates, gets]* c[reminds - duplicates, x - gets]/c[reminds, x]*1.; (* 等牌+模型 *) pPlus[a_, b_] := (Times @@ Table[c[a[[n]], b[[n]]], {n, 1, Length[a]}])/ c[Total[a], Total[b]]*1.无法识别或无法翻译,已删除。无法识别或无法翻译,已删除。