前几天我和我们工作室4位小伙伴吃饭,点了一只乳鸽,服务员将它分成了5份:两条腿、两个翅膀、一个头。类似这样。
这就出现了困境:腿最肥美,翅膀凑合,头压根没肉!
如果你先夹腿,就会承受其他人的道德谴责;如果先夹头,看着别人大口吃腿又心有不甘。
我们5个人都要脸,所以最后决定以世界上最公平的方式决出大家挑乳鸽的顺序:石头剪子布!没想到这一玩,硬是玩了半天才决出胜负!从一开始的兴致勃勃,杀到后来都杀红了眼。
嚼着已经凉了的乳鸽头时,我不禁发出了和题主一样的疑问:N个人通过石头剪刀布决出一个胜者所需要的轮数的数学期望是多少呢?
算了一半在网站Mathematics Stack Exchange上搜到了算法== Rock, Paper, Scissors Probability For Multiple Players。在此直接给大家介绍一下吧……
n个人玩一局,一共就三种结果:
我们先来计算情况3的概率。考虑n个人只出了石头+剪子的概率,之后再乘以3即可。
n个人只出了石头+剪子,包括:1个人石头和(n-1)个人剪刀,2个人石头和(n-2)个人剪刀……(n-1)个人石头1个人剪刀。其概率为
再乘以3倍,得到n个人一轮非平局的概率是 ,平局的概率是 。
在m<n时,相当于这n个人只出了石头、剪子、布中的其中两种,而且m个人出了赢的那个,(n-m)人出了输的那个。易得概率是
在m=n时,就是平局的概率,上面已经算过了。
因此,n个人玩一局石头剪子布后,恰好剩下m个人的概率是
记Q(n,k)代表n个人玩石头剪子布,恰好打了k轮后决出最终一个获胜者的概率。
比方Q(5,3)代表5个人打3轮决出胜负,可分为以下情况:
看出递推关系是
初值Q(1,1)=1,Q(1,k)=0,Q(n,0)=0。然后可以用matlab求解出不同人玩的局数的概率分布。
那么数学期望就是对应乘一下。
这个函数上升是非常快的。6个人平均要6局决出胜者,10个人大概24局。但15个人就要159局了,25个人往上就要几万局以上才能决出那个胜者了。
所以我建议,在人数大于10时,应慎用石头剪子布作为解决问题的方式,否则你们可能得连玩10分钟石头剪子布,很烦的。
上述结论很好解释。因为当人很多的时候,每局肯定都是出啥的都有,把把平局,有人输反而变成了非常罕见的情况。玩半天根本人就不会减少,局数也就奇多无比。
你想啊,如果100个人为了一只乳鸽玩石头剪子布,结果有99个人出布,偏偏你出石头而被淘汰了!这尼玛是什么运气!我劝你也别玩了,去买基金赢的可能都比这口乳鸽多。
但如果非要追求趣味性的话,也可以就这么硬玩,甚至还可以参考 @GOUKI 的回答「剪刀石头布」游戏还有其它变种吗?
采用石头剪子布的进化版,让场面更加欢乐。
当时为了分乳鸽,我们约定的不只是用石头剪子布决出一个胜者,而是决出一名胜者后,由她先挑,其余4人继续石头剪子布决出胜者。
而且咱们玩石头剪子布也并不是瞬间出手的,而是有一个施法咏唱:“石~头~剪~子~布!!!”这个咏唱过程算5秒不过分吧(我国部分地区的咏唱是“cei~丁~壳!”,我不知道这说的是什么,但可以节约2到3秒的时间)。
出完之后,大家还得盯着看一会,判断一下本局谁赢谁输,又5秒过去了。
然后还要针对本轮战况哈哈哈哈笑一波,再讨论一波,又花了5秒。
我们还有个同事讲玄学,出手前还要加上自己独特的施法前摇动作,祈求好运同时干扰对手,很浪费时间。
还有个同事自己一输就举报别人出早了,要求重来……
总之为了一个乳鸽无所不用其极,诸多因素叠加,导致战局十分漫长。
当比赛进行到我与另一个人的究极对决时,已经过去10分钟了。我们望向对方,打算赌上自己的荣誉决斗,势必要把鸽头送给对方。
此时第一个吃腿的人已经吃完等着我们,另外俩人也正在旁边啃得十分香甜,笑容嚣张无比,我俩心态当场就崩了。最终我俩连和5局,我灵机一动,提议再点一只,咱俩平分。她欣然同意,双方最终握手言和。
并将N个人通过石头剪刀布决出一个胜者所需要的轮数的概率分布命名为“公平鸽头分布”,因为真TM公平个头啊!
%一小截matlab clear warning('off') N = 50;K = 1e5; Q = zeros(N,K+1);Q(1,1)=1; P = zeros(N,K); for i=1:N for j=1:K P(i,j)=Pnm(i,j); %先求出P矩阵 end end for i=2:N tic for j=2:K Q(i,j)= P(i,1:i)*Q(1:i,j-1); end toc end prob = Q(2:N,2:K); %N个人K局的概率表格 v = 1:1:(K-1); E_n = (prob*v')'; %求出期望 function P = Pnm(n,m) % 就是上面的P(n,m) if n < m P = 0; elseif n == m P = 1- (2^n-2)/(3^(n-1)); else P = nchoosek(n,m)/3^(n-1); end end