类似无穷期望概率题

  • Post author:
  • Post category:其他



首先介绍:

两个人抛硬币来决定谁吃这个苹果,先抛到正面者吃。问先抛者吃到苹果的概率是多少?


此种,先假设某种情况,需要P,再根据下一个状态推出递推方程,即可求解。




以下借鉴:





http://www.cnblogs.com/atyuwen/archive/2010/09/12/coin.html




http://blog.csdn.net/wangran51/article/details/8882088




http://blog.csdn.net/pure_life/article/details/8100984




题1:



问题描述:


有一个木桶,里面有M个白球,小明每分钟从桶中随机取出一个球涂成红色(无论白或红都涂红)再放回,问小明将桶中球全部涂红的期望时间是多少?



分析过程:



数学期望类的题目,主要是要理解什么是数学期望,数学期望是干什么用的,关于这些问题的解答,大家可以自己去理解,思考或者翻书,我要讲的内容是如何利用这些数学期望的特点。


数学期望的递归特性:


飞行棋大家都玩过吧,应该知道每次抛到6,就有一架飞机可以出门了,那么问你一架飞机可以出门的时候,抛筛子次数的数学期望是多少?


你估计会毫不犹豫的说是6(P=1/6,E=1/P=6),但是你思考过深一层次的原因吗?


好吧,我来告诉你,我们记抛6的期望次数是E,如果第一次抛的是6,

那么就是1

次,概率是1/6;

如果第一次不是6

呢,那么次数是1+E,概率为5/6;


那么


E = 1 * (1/6) + (1+E) * (5/6)


,你可以很容易的解出 E = 6


上面加粗的红色字体用的就是类似一个递归的概念,希望你能理解吧,不行的话,那只能自己去努力理解了,呵呵。


现在我们开始解答上面的问题:


令P[i]代表M个球中已经有i个球是红色后,还需要的时间期望,去将所有球都变成红色。


So,给出递归式:

P[i]= (i/M) * P[i] + (1-i/M)* P[i+1] + 1


我相信大家都能理解这个公式的含义,不过还是解释一下,在P[i]的情况下,我们选一次球,如果是红球,

那么概率是i/M

,子问题还是P[i],如果是白球,

那么概率是1-i/M

,子问题是P[i+1],注意你

当前的选球操作要计算在内,即一次


化简如上递归式得:


P[i] = P[i+1] + M/(M-i)


,显然


P[M] = 0


;


所以:


P[M-1] = P[M] + M/1


P[M-2] = P[M-1] + M/2




P[0] = P[1] + M/M


综上:


P[0] = 0 + M/1 + M/2 + … + M/M




至此问题已经解决,不过我希望大家学到的不是这个答案,而是分析这个题目的过程




题二:



在一款游戏中,武器等级可以分为0-7级,武器每次升级需要一块宝石,每次升级可能出现三种情况:

升一级、保持不变、降一级



已知i->i+1升一级概率为Ai,保持不变概率为Bi,降一级概率为Ci。


A0~A7,B0~B7,C0~C7均已知,其中从等级0到等级1必定成功,即A0=1,B0=0,C0=0


现在问你将武器从0级升级到3级需要的宝石数的期望?


如果大家在看这篇博文之前,没有阅读我之前的博文:

面试题中的概率问题-数学期望(1)

,请大家先去看看,主要关注【

数学期望中的递归特性






分析过程:


设f(x,y)表示从x升级到y的宝石数期望,则:


f(0,3)  =  1 + f(1,3)


f(1,3)  =  A1*(1+f(2,3)) + B1*(1+f(1,3)) + C1*(1+f(0,3))


f(2,3) =  A2*1 + B2*(1+f(2,3)) + C2*(1+f(1,3))


很明显,这是一个三元一次方程组,必定可以计算出f(0,3),f(1,3),f(2,3)


其中


f(0,3)


为最终的答案


其实,这个思想并不难,关键是有没有想到,下面做简单分析


  • f(0,3)用一块宝石升级到1级后,继续的期望是f(1,3) =>  f(0,3) = 1 +f(1,3)

  • f(x,y)用一块宝石升级一次后,有Ax的概率升一级,之后期望为f(x+1,y),这部分为Ax*(1+f(x+1,y)),之后部分类似分析,即可得到 f(x,y) = Ax*(1+f(x+1,y)) + Bx*(1+f(x,y)) + Cx*(1+f(x-1,y)),关于x与y的大小,还有一些边界就自己去考虑吧

  • f(x,x)为0




最终答案:


如果我们令[A0,B0,C0] = [1,0,0] ,[A1,B1,C1] = [1/3,1/3,1/3],[A2,B2,C2] = [1/9,4/9,4/9] ,那么


f(0,3) = 30


f(1,3) = 29   f(2,3) = 25


注意,根据我们上面简单分析中的第二条f(x,y)的计算,其实可以解决升级到任意等级的需要的宝石数,包括将最高等级扩展到N,只要有对应的[Ai,Bi,Ci],因为实际上最后问题都是一个方程组,可以编程来解决,参考矩阵的相关知识,见数值计算。



题3:


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


上面这个题目我第一次见到是在pongba的TopLanguage的一次

讨论

上,提出问题的人为Shuo Chen,当时我给出了一个解法,自认为已经相当简单了,先来考虑一下抛硬币的过程:首先先抛一枚硬币,如果是花,那么需要重头开始;如果是字,那么再抛一枚硬币,新抛的这枚如果也是字,则游戏结束,如果是花,那么又需要重头开始。根据这个过程,设抛硬币的期望次数为T,可以得到关系


T = 1 + 0.5T + 0.5( 1 + 0.5 * 0 + 0.5T)  //可以用分支递归状态法


解方程可得到 T = 6. 由于上面这个方法只能得到期望,而无法得到方差以及具体某个事件的概率,后来我又仔细分析了一下,推出了

概率生成函数

为(推导的过程暂时略过,后面你会看到一个更一般、更简单的推导)






于是可以算出方差 V = G”(1) + G'(1) – G'(1)^2 = 22。将G(z)根据Rational Expansion Theorem [CMath 7.3]展开,可以得到需要抛n次硬币的概率为






其中Fn是Fibonacci数列的第n项。到这里,我觉得这个问题似乎已经完全解决了,直到昨天看到Matrix67的

牛B帖

。在此帖中Matrix67大牛用他那神一般的数学直觉一下将需要连续抛出n个字的一般情形给解决了,而且得出的结果相当简洁:Tn = 2^(n+1) – 2,其中Tn为首次出现连续的n个字的期望投掷数。这也给了我一些启发,我试着将上面的过程进行推广,居然得到一个简单得出人意料的解法(甚至比上面n=2的推导过程还简单)。这个解法的关键在于下面这个递推关系


Tn = Tn-1 + 1 + 0.5 * Tn


也即是有 Tn = 2 * Tn-1 + 2。由于 T1 = 2,因此可以得到 Tn = 2^(n+1) – 2。上面的递推关系是怎么来的呢,一个直观的理解是这样的:首先先抛掷Tn-1次,得到连续的n-1个字,然后再抛一次,若是字,则游戏结束;否则需要重头开始,也就是说又需要 Tn 次。


期望投掷次数已经得出来了,但是我们还想知道方差、恰好需要投掷 m 次的概率等其它一些更具体的性质。为了方便理解概率的分布情况,我先用程序生成了一个概率表如下所示。在下表中,第n行、第m列的元素为 Pnm,表示首次出现连续n个字的投掷数为m的概率。


1/2

1/4

1/8

1/16

1/32

1/64

1/128

1/256

1/512

1/1024

0

1/4

1/8

2/16

3/32

5/64

8/128

13/256

21/512

34/1024

0

0

1/8

1/16

2/32

4/64

7/128

13/256

24/512

44/1024

0

0

0

1/16

1/32

2/64

4/128

8/256

15/512

29/1024

0

0

0

0

1/32

1/64

2/128

4/256

8/512

16/1024


仔细观察上表,你发现什么有趣的性质没?如果忽略掉分母的话,那么第n行恰好是一个n阶Fibonacci数列。例如可以考查各行的最后一列,有


第一行:1 = 1


第二行:34 = 21 + 13


第三行:44 = 24 + 13 + 7


第四行:29 = 15 + 8 + 4 + 2


第五行:16 = 8 + 4 + 2 + 1 + 1


怎么解释这个现象呢?我们再来仔细考虑一下掷硬币的过程,为方便在下文中用1表示字,用0表示花,于是我们的目标是要恰好使用m次投掷,得到连续的n个1.


若第一次的结果为 0,那么剩下的任务就是恰好使用m-1次投掷得到到连续的n个1.


若前两次的结果为 10, 那么剩下的任务就是恰好使用m-2次投掷得到到连续的n个1.


若前三次的结果为 110, 那么剩下的任务就是恰好使用m-3次投掷得到到连续的n个1.


若前四次的结果为 1110, 那么剩下的任务就是恰好使用m-4次投掷得到到连续的n个1.




若前n-1次的结果为 1…10(n-2个1), 那么剩下的任务就是恰好使用1次投掷得到到连续的n个1.


你或许已经看出来了,这里实际上是在枚举首次出现0的位置。由于首个0出现在位置i的概率为1/2^i,于是得到Pnm的递推公式






于是根据初始条件:







,我们可以推出所有事件的概率。现在来推一下概率生成函数,设需要得到连续n个1的投掷数的概率生成函数为Gn(z),于是有






根据上面的递推公式和初始条件,可以得到






于是可解得






分别代入 n = 1 和 n = 2 可以得到










以我们前面得到的结果一致,这证明这个概率生成函数的确是正确的。有了生成函数后,我们又多了一种计算期望的方式






而方差也可以非常容易的得到






至此,这个抛硬币的问题终于应该算是被完全解决了,完。



此题的一个推广:


设想有这么一家赌场,赌场里只有一个游戏:猜正反。游戏规则很简单,玩家下注 x 元钱,赌正面或者反面;然后庄家抛出硬币,如果玩家猜错了他就会输掉这 x 元,如果玩家猜对了他将得到 2x 元的回报(也就是净赚 x 元)。

让我们假设每一回合开始之前,都会有一个新的玩家加入游戏,与仍然在场的玩家们一同赌博。每个玩家最初都只有 1 元钱,并且他们的策略也都是相同的:每回都把当前身上的所有钱都押在正面上。运气好的话,从加入游戏开始,庄家抛掷出来的硬币一直是正面,这个玩家就会一直赢钱;如果连续 n 次硬币都是正面朝上,他将会赢得 2^n 元钱。这个 2^n 就是赌场老板的心理承受极限——一旦有人赢到了 2^n 元钱,赌场老板便会下令停止游戏,关闭赌场。让我们来看看,在这场游戏中存在哪些有趣的结论。


首先,连续 n 次正面朝上的概率虽然很小,但确实是有可能发生的,因此总有一个时候赌场将被关闭。赌场关闭之时,唯一赚到钱的人就是赌场关闭前最后进来的那 n 个人。每个人都只花费了 1 元钱,但他们却赢得了不同数量的钱。其中,最后进来的人赢回了 2 元,倒数第二进来的人赢回了 4 元,倒数第 n 进来的人则赢得了 2^n 元(他就是赌场关闭的原因),他们一共赚取了 2 + 4 + 8 + … + 2^n = 2^(n+1) – 2 元。其余所有人初始时的 1 元钱都打了水漂,因为没有人挺过了倒数第 n + 1 轮游戏。


另外,由于这个游戏是一个完全公平的游戏,因此赌场的盈亏应该是平衡的。换句话说,有多少钱流出了赌场,就该有多少的钱流进赌场。既然赌场的钱最终被赢走了 2^(n+1) – 2 元,因此赌场的期望收入也就是 2^(n+1) – 2 元。而赌场收入的唯一来源是每人 1 元的初始赌金,这就表明游戏者的期望数量是 2^(n+1) – 2 个。换句话说,游戏平均进行了 2^(n+1) – 2 次。再换句话说,平均抛掷2^(n+1) – 2 次硬币才会出现 n 连正的情况。




题4:


面对面试概率题几乎屡试不爽的



分叉树递归列方程法



。————》



个人觉得


分支递归状态法


名字比较合适(题二,题一,三均可用此法!!)







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



这样分叉树的每个节点是一个期望状态,而每个分叉是一次投掷结果。将后续期望出现1、2、3各至少一次的情形记作

L


123

(即题目所求),将后续期望出现1、2各至少一次(3无关)情形记作

L


12

,而1至少一次(2,3无关)情形

L


1

,其余数值符号类推,则树结构如下(列出4级结构已经足够):



第一级(树根)



第二级



第三级



第四级别




L


123





掷1->L


23






掷1->

L


23




同状态














掷2->


L


3




根据投掷结果,或继续期待

L


3

,或已经达到目标














掷3->


L


2




根据投掷结果,或继续期待

L


2

,或已经达到目标









掷2->

L


13






掷1->

L


3




根据投掷结果,或继续期待

L


3

,或已经达到目标














掷2->


L


13




同状态














掷3->


L


1




根据投掷结果,或继续期待

L


1

,或已经达到目标









掷3->

L


12






掷1->

L


2




根据投掷结果,或继续期待

L


2

,或已经达到目标














掷2->


L


1




根据投掷结果,或继续期待

L


1

,或已经达到目标














掷3->


L


12




同状态



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



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




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




L


123




= p


1

(L


23



+ 1


) +


p


2

(L


13

+


1) + p


3

(L


12

+ 1) = p


1

L

23

+


p


2

L


13

+


p


3

L


12

+ 1



(以这个

L


123

为例,解释,投掷1的概率是


p


1


而由此得到的结果是需要期待后续2和3各至少出现一次,于是长度期望是

L


23

+ 1,加1是因为投掷了一次,亦即即增进一级)





L


23


=

p


1

L


23

+


p


2

L


3

+


p


3

L


2

+ 1





L


13


=

p


1

L


3

+


p


2

L


13

+


p


3

L


1

+ 1





L


12


=

p


1

L


2

+


p


2

L


1

+


p


3

L


12

+ 1





L


1


=



p


2

L


1

+


p


3

L


1

+ 1



(这里实际上是

L


1


=









p


1


·1 + p


2

(L


1

+


1) + p


3

(L


1

+

1)

=


p


2

L


1

+


p


3

L


1

+ 1,因为对

L


1

情形,如果投了1就目的达到终止了)





L


2


=

p


1

L


2

+


p


3

L


2

+ 1





L


3


=

p


1

L


3

+


p


2

L


3

+ 1





(以上一开始没注意,多加了悬空的概率项,故计算有误)






其中


p


1




,p


2





p


3


分别是掷出1,2和3的概率,即1/6,1/3,1/2。



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





L


1

= 6,

L


2

= 3,

L


3

= 2





L


12

= 7,

L


13

= 13/2,

L


23

= 19/

5





L


123


=

219/30 = 7.3




故以上如果没有计算错误,该题结果是,平均掷7.3次可出现这些面值各至少一次。