记录一次由打扑克牌测试国内各家大模型的经历
记录一件事情,感觉挺有意义的,也很有趣。
昨天打扑克牌,由于这把扑克牌少了一张10,就找了一张其它扑克牌里的10补上了,后来又找到了这张10,就又放进来了,但补的10也没去掉,因此共有五张10。三个人打牌,把牌分完,这次居然出现了五张10全到一个人手里的情况,于是想就算一下这个出现的概率是多少。
为了简化问题,还是把牌设置为标准情况:方块、梅花、红桃、黑桃各13张,还有两张王,共54张牌,三人一起玩,每人18张牌,求任意一个人拿到四张K的概率(计算任意一个人同时集齐四张相同的任意数字的牌其实没啥区别)。
心里很清楚,这就是一个高中学过的排列组合问题,但一时竟然不知道如何下手去求解。
最初的想法是四张相同的牌发给三个人,不管发放顺序是什么,总之共有12种分法,其中4/0/0共三种、3/1/0共有六种、2/2/0共有三种,因此四张牌落到同一个人手里的概率是3/(3+6+3)=0.25。但这明显不符合直觉,因为这个概率太大了。
后来就想着写个程序仿真一下,应该叫蒙特卡罗法吧,随机模拟发牌,多发几次,看看概率是多少。写了一个数组,用1到13表示从1到K,用-1和-2表示大王和小王,模拟发一千万次牌,Matlab程序如下:
clear;clc;close all;
puke = [1:13,1:13,1:13,1:13,-1,-2];max_iter = 10000000;
is_ok = 0;
for ii=1:max_iteri_perm = randperm(54);puke_perm = puke(i_perm);for person=1:3bias = (person-1)*18;person_i = puke_perm(1+bias:18+bias);person_s = sort(person_i,'ascend');first4 = person_s(15:18);first4_sum = sum(first4==13);is_ok = is_ok + (first4_sum==4);end
end
disp([num2str(is_ok),'/',num2str(max_iter)])
程序运行结果是有一定的随机性的,但大概得到的概率是0.029左右,为什么呢?
于是想到问了一下大模型。
一是问了手机端的讯飞星火大模型,得到的结果是错的。
二是问了手机端的豆包,得到的结果也是错的。
三是问了PC端百度主页的deepseek-R1最新版、联网搜索(https://chat.baidu.com/)然后就一直在思索,直接不出结果。
四是问了PC端的deepseek官网(未勾选深度思考(R1)和联网搜索),得到了结果为20/689,约为0.029;勾选深度思考(R1)和联网搜索后也可以得到一样的结果。
五是问了PC端百度主页的deepseek-V3最新版、联网搜索,可以得到正确结果;切换为文心4.5也可以得到正确结果。
六是问了PC端讯飞星火(勾选了深度推理(X1)和联网搜索),也得到了正确结果。
七是问了PC端纳米AI搜索,使用默认设置:深度思考(DeepSeek-R1-联网满血版 671B),未得到正确结果。
八是问了PC端通义大模型,试了三次,分别勾选了不同的配置(深度思考、分析研究等,具体记不清了),只有一次得到了正确结果。
这个问题其实现在看来也很简单,概率为:
P = 3*C(50, 14)/C(54, 18)
其中,C(54, 18)为从54张牌中随机取18张牌的所有可能情况数目,而C(50, 14)表示固定四张牌(比如四张K)之后,再从剩余50张牌中随机取14张牌的所有可能情况数目,因为不限定哪个人拿到四张K,因此要乘以3。把排列组合公式带进去,这个概率就是3*18*17*16*15/54/53/52/51,化简后就是20/689。
其实有些出错的大模型,它们的结果只差那么一点点,有些看起来分析过程是对的,但在计算时出错了,有的是没有乘以3,也可能是我的问题有歧义。
这次有个收获是deepseek官网和各家部署的deepseek在性能上还是有些许差异的~
最后,我还想说的是,可以基于概率论去计算一下,打扑克牌时,其实每次发完牌后,这种分发结果出现的概率都是很小的,从概率上来讲都可以认为是小概率事件。一般认为,小概率事件是不可能发生的,但实际上小概率事件每时每刻都在发生着,因此生活的每个时刻都是独一无二的,无数的机缘才有了“现在”,所以珍惜每一天、每一刻吧,它们基本都是不可能再复现的:
Yesterday is history, tomorrow is a mystery, but today is a gift.
加油!