在学校论坛里看到如下算法题目:

一个骰子,6面,1个面是 1, 2个面是2, 3个面是3, 问平均掷多少次能使1,2,3都至少出现一次?

自己的第一想法是用求数学期望的公式来求解,但看了评论里大神用分叉树递归列方程法很简单的解决了这个问题,顿觉新颖,记录如下。

还是用例子来讲解这种方法。

实例一

问题:

一个骰子,6面,1个面是 1, 2个面是2, 3个面是3, 问平均掷多少次能使1,2,3都至少出现一次?

分析:

这是一个求数学期望的问题,最终是求1,2,3出现至少一次的最短长度的期望。

这样分叉树的每个节点是一个期望状态,而每个分叉是一次投掷结果。将后续期望出现1、2、3各至少一次的情形记作L123(即题目所求),将后续期望出现1、2各至少一次(3无关)情形记作L12,而1至少一次(2,3无关)情形L1,其余数值符号类推,则树结构如下(列出4级结构已经足够):

图片描述

接下来,就是要排出方程,因为一共7个未知数(L123,L12,L23,L13...),如果排出7个线性方程就能解决问题。

这方程组里的未知数对应上述的状态,而其数值则是一个对长度(投掷次数)的数学期望。

根据这个树状结构和其中的递归关系,这个方程组就是:

L123 = p1*(L23+ 1) + p2*(L13+1) + p3*(L12 + 1) = p1*L23 + p2*L13 + p3*L12 + 1

(以这个L123为例,解释,投掷1的概率是p1而由此得到的结果是需要期待后续2和3各至少出现一次,于是长度期望是L23+ 1,加1是因为投掷了一次,亦即即增进一级)

L23 = p1*L23 +p2*L3+ p3*L2 + 1

L13 = p1*L3 +p2*L13+ p3*L1 + 1

L12 = p1*L2 +p2*L1+ p3*L12 + 1

L1 =p2*L1+ p3*L1 + 1

(这里实际上是 L1 =p1*1 + p2*(L1+1) + p3*(L1 +1) =p2*L1+ p3*L1 + 1,因为对L1情形,如果投了1就目的达到终止了)

L2 = p1*L2 + p3*L2 + 1

L3 = p1*L3 +p2*L3+ 1

其中p1,p2和p3分别是掷出1,2和3的概率,即1/6,1/3,1/2。

于是求解这个方程,得到:

L1 = 6, L2 = 3, L3 = 2
L12 = 7, L13 = 13/2, L23 = 19/5
L123 = 219/30 = 7.3

平均掷7.3 次可出现这些面值各至少一次。

用分叉树递归列方程法在来求解另一个概率问题,如下:

实例二

问题:

假设有一个硬币,抛出字(背面,记为T)和花(正面,记为H)的概率都是0.5,而且每次抛硬币与前次结果无关。现在做一个游戏,连续地抛这个硬币,直到连续出现两次字为止,问平均要抛多少次才能结束游戏?注意,一旦连续抛出两个“字”向上游戏就结束了,不用继续抛。

分析:

LTT记为后续期望出现连续两个T的节点,其值即为所求。LT记为下一次投掷结果期望出现T的节点。

第一级(树根) 第二级 第三级
LTT 掷T -> LT 掷T -> 结束
. . 掷H -> LTT
. 掷H -> LTT .

根据树状结构和其中的递归关系列方程如下:

LTT = pT*(LT+1) + pH*(LTT+1)

LT = pT*1 + pH*(LTT+1)

其中pTpH分别是掷出字和花的概率,即为0.5,0.5
求解上述方程式,可得到:

LTT = 6

参考

抛硬币 直到连续出现两次字为止


jack2wang
753 声望27 粉丝