这些天会想起姥姥,姥姥已经离开我 10 多年了,虽然她的形象渐渐模糊,但总记得她对我的好,和带我长大的一些瞬间。还能想起那时候父母工作忙,我在姥姥家生活了一年。

姥姥每年过年都会摆一个扑克,这个扑克叫 12 月,来预测一年的运势。规则倒是不难,还没上学的我也能很快的学会,也每年跟着摆起来,模糊的印象里好像我还摆开过几年。

12 月的规则是这样的:

玩法是先把扑克 54 张牌中的两个王、四个K去掉,然后把剩余的 48 张牌洗牌后分成背面向上的十二叠,每叠四张,这十二叠分别代表未来一年的十二个月。接下来,抽出第一叠最底下的一张牌并翻开,按照牌上面的数字放到相应月份的那叠牌上方,比如数字是 2,就放到第二叠代表 2 月的牌最上方;数字是 J,就放到第十一叠代表 11 月的牌最上方,然后把放牌的那叠牌最底部的一张牌抽出并翻开,同样地按照数字放到相应月份的牌上。这样一直下去,直到四张 A 全部翻出,一局游戏就停止了。如果四张 A 翻出时候其余的牌也全部翻出,那么就说明这局赢了,这一年都会伴随着好运,当然没全部翻出也不算输,这一年总有几个月翻开的,那几个月我会迎接好运。

等到自己上初高中,懂了一点点概率知识,我也曾经好奇过,摆开 12 月的概率会是多少呢,当然只是过年摆 12 月时候的一闪念,摆完之后也没像其它那些知名的数学家一样,去真正的算这个概率。

后来,我会写了程序,也有了娃,娃也开始每年过年能自己去摆 12 月,娃第一次自己摆开 12 月。 我还能清楚的记得我的好奇,我坐着沙发上盯着小孩摆 12 月,头脑里想着,也许我可以用不同的 seed 写个模拟,去跑个 100 万次,然后就知道了大概的概率。不过还是只有过年我们才会玩这个游戏,一般转身就忘了这件事,去忙过年该有的,其它的活动了。

直到今天,我又想起了这件事。但今天不太一样,今天有了大模型,今天的大模型解决这种问题几乎只需要一个 prompt. 于是我打开了 codex app 把这个贯穿了我 30 年 3 代人的困惑输入了进去。

Image

什么?1/12 之一,为什么如此 simple, 为什么?当然下面的解释我看明白了,也有点遗憾,我会写程序会用模拟的时候就大概能得出这个结论,但是这个结论晚了好多年,上一次这种疑问还是来自我第一次知道残差去查这个牛逼的残差是什么,然后也是这种感觉,竟然如此的 simple.

下面是 GPT 5.5 codex 的解释

#48 张牌里,1 到 Q 共 12 种点数,每种 4 张。
#除了第 1 组,别的组不会提前“抽爆”。比如第 3 组:只有翻到 3 才会去抽第 3 组,而整副牌只有 4 张 3,最多只会要求抽第 3 组 4 次,刚好够。
#第 1 组特殊,因为游戏一开始就已经先抽了第 1 组一次。之后每翻到一张 1,又会回第 1 组。翻到第 4 张 1 后,就会要求第 5 次抽第 1 组,于是停局。
#所以游戏是否成功,等价于:第 4 张 1 是不是整副 48 张里最后被翻出来的牌。这又等价于:最后一张牌是不是 1。
from fractions import Fraction
from math import comb
import random

RANKS = 12
COPIES = 4
TOTAL = RANKS * COPIES

exact = Fraction(comb(TOTAL - 1, COPIES - 1), comb(TOTAL, COPIES))
print(exact, float(exact), f"{float(exact) * 100:.6f}%")

def play_once(rng):
    deck = [rank for rank in range(1, RANKS + 1) for _ in range(COPIES)]
    rng.shuffle(deck)

    piles = [deck[i * COPIES:(i + 1) * COPIES] for i in range(RANKS)]

    current = 1
    revealed = 0
    while piles[current - 1]:
        card = piles[current - 1].pop()
        revealed += 1
        current = card

    return revealed == TOTAL

rng = random.Random(20260708)
trials = 500_000
wins = sum(play_once(rng) for _ in range(trials))

print(wins / trials, f"{wins / trials * 100:.6f}%")

当然我后面有很多追问,我都问了这些问题。

  • 那么如果成功了 6 个月的概率呢?成功了 7 个月的呢?
  • N 等于 1 -12 每个的概率
  • 对么?特别反直觉,正好一个月成功肯定不是 8.33333%从我的经验看,我玩了无数把没有一次只成功了一个月
  • 能动画的模拟吗??
  • ok 有办法帮我找找网络上还有其他人研究过这个问题吗?
Image

最后一个问题答案很有趣:

  • 原来 12 月在英文世界有个类似的游戏叫 Clock Solitaire / Clock Patience
  • 原来神 Knuth 也研究过和解决过这个问 https://people.sc.fsu.edu/~jburkardt/fun/puzzles/solitaire_solution.html
  • 他们也怀疑这个问题的答案竟然能如此的 simple 然后写程序去模拟 https://math.stackexchange.com/questions/20087/probability-of-clock-patience-going-out

最后的最后:

  • 感谢大模型解决了我的困惑,还让我学到了不少东西。
  • 但是它没解决我对姥姥的想念。
  • 今年过年再玩这个游戏,我可以把这个概率的故事分享给我儿子,他才 3 年级不一定能理解,但是 10 年后他也会想念起春节爸爸和他的关于这个概率的对话吧?