[心得] 扑克与排列组合

楼主: jurian0101 (Hysterisis)   2014-04-10 18:05:55
扑克牌13支(外国多称为Chinese Poker)当中,顾名思义手牌有13张
分为3,5,5张的三墩。
牌品为:高牌、一对、两对、三条、顺子、同花、葫芦、铁支、同花顺
其中有些 特殊牌型 如 六对子 (ex. AA 22 33 44 55 55 K)、三同花(同花)、三顺子
前两个并不需要用到Mathematica,就能算出来共有几种组合,机率多少
只要用 Wolfram Alpha 线上计算就可以了
例如六对半
考虑有 k 个铁支的状况,总组合有
Σ C(13,k)*C(13-k,6-2k)*C(4,2)^(6-2k)*(52-12), {k,0,3} = 3 542 247 280
(ps当然,会把三铁支当六对半的人是疯子,但排列组合,数学上来讲这样更简单)
还有三同花
C(4,3)*3*C(13,5)^2*C(13,3) + C(4,2)*2*C(13,8)*C(13,5) +
C(4,2)*2*C(13,10)*C(13,3) + 4 = 5 705 516 392
(ps各项依序为[三种花色] + [两种花色为5张8张] + [两种花色为3张10张] + [理论上
也能算三同花的一条清龙] )
三顺子就比较难算了,可能性较多,就要藉程式辅助
Total[Times @@@ ((Tally /@ (Tuples[{Range[11], Range[10], Range[10]}] /.
{x1_, x2_, x3_} :> (Flatten[{Range[x1, x1 + 2], Range[x2, x2 + 4], Range[x3,
x3 + 4]}]/. 14->1 ))) /. {_, n_} :> Binomial[4, n])]
一行码,基本精神:反正每个数字有四张,三个顺子重叠没关系
首个顺子可以从 (123) 到 (JQK),11取1。后两个可以从(12345) 到 (TJQKA),10取1。
所以用Tuple取出像 {1, 10, 3} 这种数列
把它转换成顺子所需的牌 {{1,2,3}, {10,11,12,13,1}, {3,4,5,6,7}}
然后每种数字选择花色,有k张的方法是 C(4,k) 全部相乘,加总。
得到 4 662 122 240 种
目前小结:
六对半 3542247280 种,机率0.56%
三同花 5705516392 种,机率0.90%
三顺子 4662122240 种,机率0.73%
与超好的牌相反,有些牌型你拿到会怨叹今天到底该说今天运气太好还是运气太差
例如 “超烂两对子”,恰两对,却没有顺子,也没有同花
这可能吗?只要恰好断在 5 与 10,其余中两个是对子、其余各一张即可
如 A22 33467 89JQK。 (断在5与10是只有两对的唯一一种可能,简单可验证。)
已经完成两个条件了,“没有同花”怎么排?
这里介绍 IntegerPartitions 函数
IntegerPartitions[13, {4}, {0,1,2,3,4}]
│ │ 可以使用的数,小于5,要是5张就同花了
│ 分成几个数
被分的数
= {{4, 4, 4, 1}, {4, 4, 3, 2}, {4, 3, 3, 3}} 结果证明把0加进去是多余的
这就是可能的花色张数(分别有4,12,4种排列),这其实用手就算得出来XD
然后,要把 A22 33467 89JQK 分进去......吗?别傻了不用真的分
以 {4,4,3,2} 为例,我们有两个对子 22 33,同数字花色必须不同
于是必须做从{4,4,3,2} 挑两个数减1,共做两次这个动作
令gp={{1,1,0,0},{1,0,1,0},{1,0,0,1},{0,1,1,0},{0,1,0,1},{0,0,1,1}}
第一次减
Flatten[ Outer[Subtract, {{4,4,3,2}}, gp, 1 ],1]
这里有铺梗 这个1有学问,他是指定深度1,也就是将
{1,1,0,0}这样的括号(向量) 当一个物件
非要不可,否则会被MMA解读成神奇的高
维度张量运算。
第二次减
Flatten[ Outer[Subtract, % , gp, 1 ],1]
没错梗在于公式完全一样,不用再打一次^^
会跑出
{{2,2,3,2},{2,3,2,2},{2,3,3,1},{3,2,2,2},{3,2,3,1},{3,3,2,1},{2,3,2,2},
{2,4,1,2},{2,4,2,1},{3,3,1,2},{3,3,2,1},{3,4,1,1},{2,3,3,1},{2,4,2,1},
{2,4,3,0},{3,3,2,1},{3,3,3,0},{3,4,2,0},{3,2,2,2},{3,3,1,2},{3,3,2,1},
{4,2,1,2},{4,2,2,1},{4,3,1,1},{3,2,3,1},{3,3,2,1},{3,3,3,0},{4,2,2,1},
{4,2,3,0},{4,3,2,0},{3,3,2,1},{3,4,1,1},{3,4,2,0},{4,3,1,1},{4,3,2,0},
{4,4,1,0}}
这个时候表示,第一种情形,我们要把剩下的九张相异牌 (即 A 4 6789 JQK)
分派花色是 2桃 2心 3砖 2梅,分法有 9!/ (2!2!3!2!) 种
这时介绍另一个好用函数 Multinomial,他就是上述的计算
因此总和为 Total[Multinomial@@@{{2,2,3,2},{2,3,2,2}, ... ,{4,4,1,0}}]
=142590 我们讨论的花色数组是 {4,4,3,2},因此须乘以 12
但是有陷阱,当选花色数是 {4,4,4,1} 时,必须改成
Flatten[ Outer[Subtract, {{4,4,4,1}}, gp, 1 ],1]
/. {___, _?(#<0&), ___}->Sequence[]
这是因为减第二次时,选到不能减(该套花色张数用完),则出现负数
不过恰好只要把这些数组移除,剩下就是可行的数组。
这个算法的方便是其实只要这样就能得到完整的答案
suit=Flatten[ Permutations/@{{4,4,4,1}, {4,4,3,2}, {4,3,3,3}}, 1];
Flatten[ Outer[Subtract, suit, gp, 1 ],1]/. {___, _?(#<0&), ___}->Sequence[]
Flatten[ Outer[Subtract, %, gp, 1 ],1]/. {___, _?(#<0&), ___}->Sequence[]
Total[Multinomial@@@%]*Binomial[11,2] (*11号码选2成对*)
答案是 152 044 200 种,机率0.024%,或约四千分之一。
比六对半还少见,应该成立一个牌品的XD 有趣的是,多出来的两张如果是同一数字,
会变成罕见5倍,微妙的强一点点的牌“除了一个三条,什么都没有” XDDD
例如 A22234 6789 JQK
= = = =
终章
练习: 这种 "牌品" 有几种组合
“恰好三对,顺子同花什么的完全没有↖”
作者: LPH66 (-6.2598534e+18f)   2014-04-10 19:51:00
补充: 中间的 gp 可由 Permutations[{1,1,0,0}] 求出

Links booklink

Contact Us: admin [ a t ] ucptt.com