目录
1. 抽屉中的袜子
问题描述
抽屉里有红袜子和黑袜子,随机抽出两只,两只全红的概率为 1/2。
问:
a. 抽屉里的袜子最少有多少只?
b. 如果黑袜子为偶数只,则抽屉里的袜子最少有多少只?
题解a
假设抽屉中有x只红袜子和y只黑袜子,并令z=x+y。
则抽两次均为红袜子的概率可以写作:
问题转化为求使得成立的z的最小整数解。
以枚举的方式可以得到以上问题的解。比如说,由于y必定大于等于1(如果y=0的话连续抽两次就肯定是100%的两只红袜子)
令y=1,代入以上方程,可以得到x=3满足条件。因此z的最小值为4。
但是,以上其实从逻辑上来说是有缺陷的。凭什么说这就是z的最小可能的解呢?难道就不可能在y更大一些的情况反而产生更小的z吗?如果能够证明y增大一定会导致满足条件的x不可能变小的话(类似于),以上逻辑就成立了。
试了试,发现这个证明并不是想象的那么容易(留待进一步思考)。
力扣中给出的解析解(虽然利用了巧妙的不等式技巧)其实也没有严格地给出这个证明。如下所示:
以上解析解的最后一句话的描述有个typo,应该是。
但是本题比较简单,其实没有这个严格的证明也没有问题。因为可以针对y=2,3进一步枚举,如果y=2,3时z的最小值不会小于4,就表明z的最小值一定时4了。因此再往后连y都大于等于4了,z当然不可能小于4.
题解b
黑色袜子为偶数只,即
同样,由题解a给出的范围不等式,可知
y = 2, x的备选答案是5
y = 4, x的备选答案是10
....
这样一直列举下去,就可以找到满足题设条件的解。以下用一个小的python程序来求这个解,可以得到解为(x=15,y=6).
import numpy as np
k = 1
while True:
y = 2*k
x = int(np.ceil((1+np.sqrt(2))*y))
if 2*x*(x-1) == (x+y)*(x+y-1):
print('The minimal (x,y) pair is: ({0},{1})'.format(x,y) )
break
k = k + 1
2. 轻率的陪审团
问题描述
有一个 3 人组成的陪审团,其中两个人独立做决定均有 p 概率做对,另一个人通过抛硬币做决定
还有一个 1 人的陪审团,那个人做决定也有 p 概率做对。
问:哪个陪审团更有可能做出正确决定?
题解
就是问3人组成的陪审团作出正确判决的概率与p相比的大小如何?
3个人陪审团作出正确判决有以下两种情况:
- case1: 任意2人做出正确判决一人做出错误判决
- case2: 3人同时做出正确判决
case2的概率为.
case1又包含三种子情况,总的概率为
所以,其实两个陪审团做出正确判决的概率是一样的。
3. 系列赛中连续获胜
问题描述
Elmer 如果在三场的系列赛中赢下连续的两场,则可以得到奖励,系列赛的对手安排有两种
- 爸爸-冠军-爸爸
- 冠军-爸爸-冠军
这里冠军的水平高于爸爸,问:Elmer 应该选择哪一组,得到奖励的概率更大?
题解
假设Elmer与爸爸对阵的胜率为Pf,与冠军对阵的胜率为Pc,则根据题意应该有Pf > Pc.
不管采取何种对阵,Elmer获得奖励的情况如下:
- (a) 第1场胜,第2场胜
- (b) 第1场负,第2、3场胜
因此,
采取第一种对阵,Elmer获得奖励的其概率为:
采取第二种对阵,Elmer获得奖励的情况为:
由于,所以有
,Elmer应该选择第2组对阵。似乎与直觉相悖,是不是?但是,直觉会欺骗你,数学不会^-^。这里导致与直觉相悖的关键点在于Elmer想要获得奖励需要连胜两局而不是常规的三局两胜。
4. 试验直到第一次成功
问题描述
一枚骰子掷出第一个 6 平均需要掷多少次。
题解1
记代表在第k次才第一次掷出6的概率。这意味着在前面(k-1)次所掷的点数都不是6,可以得到其表达式为:
,所以,第一次掷出6的平均投掷次数的数学期望为:
后半部分的无穷级数求和需要一点点数学技巧,这里就省略了。
题解2
记m代表掷出第一个 6 的次数的数学期望。
考虑第一次掷的结果,有6和非6两种可能。第1次掷出6的条件下的条件均值显然为1;第1次没有掷出6的条件均值显然为1+m,因此由全概率公式可以得出以下方程:
解以上方程可得:m = 6
5. 装备升级
问题描述
玩家的装备有从 0 到 4 这 5 个等级,每次升级都需要一个工序,一共有 0->1, 1->2, 2->3, 3->4 这 4 个工序,成功率分别为 0.9, 0.7, 0.6, 0.5。工序成功,玩家的装备就会升一级,但如果失败,玩家的装备就要倒退一级。例如玩家当前的等级为 2,目前执行 2->3 这个工序,如果成功,则装备等级从 2 升为 3,如果失败,装备等级就从 2 降到 1。
问:玩家装备初始等级为 0, 升到 5 平均要经历多少个工序。
题解
题目描述中没有说等级0升级失败时会如何,但是应该是仍然保留在等级0吧,因为此时已经没有降级的余地了。根据题意可以画出状态转移图并基于均值的全概率公式得到方程组如下图所示:
其中E0~E4分别表示从状态0~4到达状态4所需要的步数的数学期望。显然,E4=0,因为已经在状态4了。
将p0=0.9, p1=0.7, p2=0.6, p3=0.3代入以上方程组即可求解出E0~E3。
如何直观地理解基于状态转移图列出的关于均值的方程呢?
首先,针对每个节点考察它的输出的边。比如说从状态0出发。有两种可能的结果。其一是以概率p0转移到状态1,这条支路的均值为1+E1;其二是以概率(1 - p0)回到到状态0,这条支路的均值为1+E0。基于数学期望的全概率公式(或简称全期望公式)即可以得到以上第一个方程,其余同理。
第4题的“题解2”也是采用的同样的思路,只不过状态少,不需要画图直接就可以写出方程了。
附:理论基础和方法论
全概率公式
其中,假定互斥且满足:
全期望公式
全概率公式可以看作是全期望公式的一个推论。
有向图
全期望公式的应用难点在于找出 。在第4题中中
,
比较简单,我们能快速看出
,而在稍微复杂的问题上,我们需要有一种找到
的方法论 -- 有向图。
用全期望公式求期望的过程可以用有向图的方式表示出来。比如说针对第4题,我们可以画出下面的有向图:
动态规划求解
理论上来说,画出了状态转移图,然后列出状态转移方程组,就可以利用线性方程组求解方法(比如说高斯消元法)求解。但是,对于复杂的问题,比如说,状态数高达数十甚至上百的情况,就很难再画出有向图并显示地列出所有的方程。
通过以上的分析可以发现,当根据具体问题定义好有向图 D,起点 s,终点 t 后,我们就可以用类似于动态规划的方式求从 s 到 t 的某个指标的期望。
状态定义
dp[u] := 从 u 到 t 的某个指标的期望初始化:dp[t]
答案:dp[s]
状态转移:dp[u] = g(node[u], sum(p[u][v] * f(w[u][v], dp[v])))
其中 f 是边权 w[u][v] (在上面的题中是 1) 和下一点的期望 dp[v] 的函数,g 是当前点的点权 node[u](在上面的题中没有)和 sum(p[u][v] * f) 的函数, 具体的函数形式取决于问题(在上面的题中 f 就是简单的 w[u][v] + dp[v], g 没有),需要具体分析。
求解 dp[s] 的过程:对反图(将原图中的每条有向边的方向反转之后形成的图)进行拓扑排序,按照拓扑排序的顺序依次求解各个节点 u 的 dp[u],直至求解到 dp[s]。
高斯消元
当建出的有向图中有环的时候,求解 E[s] 的过程如果直接用期望 DP 从 dp[t] 向 dp[s] 推导的话是不行的,因为在推导 DP 状态时会出现类似于下面的情况(就是后面的【用户一次游戏带来的收入】那道题的转移方程,这里提前看一下)
dp[0] = dp[1]
dp[1] = 1 + 0.7 * dp[2] + 0.3 * dp[0]
dp[2] = 2 + 0.6 * dp[3] + 0.4 * dp[1]
dp[3] = 3 + 0.5 * dp[4] + 0.5 * dp[2]
dp[4] = 0
这种情况 dp 状态的转移形成了环,比如要求 dp[1] 要先知道 dp[2],要求 dp[2] 就要先知道 dp[1],没法求了。如果方程组是线性方程组,还有有办法的,解决办法是利用高斯消元的方式整体解这个线性方程组。
关于高斯消元的推导、代码、题目,可以找相关资料学习。
方法总结
现总结求解这类期望问题的方法论如下:
- 1、理论基础:全期望公式;
- 2、处理具体问题时,我们先分析建图所需的信息:
- 1)起点 s 和终点 t 状态是什么,还有哪些状态节点;
- 2)求出各个状态节点一步可以走到哪些状态节点,概率又分别是多少;
- 3)分析目标期望是否需要额外的点权和边权。
- 3、建图,初始化 dp[t];
- 4、分析状态转移方程中的 g,f 并写出实际的转移方程;
- 5、求解 dp[s],这里注意两点:
- 如果图没有环,直接按拓扑排序的顺序应用动态规划的方式推导;
- 如果图中有环,还需进一步看方程组的形式,若是线性方程组我们可以用高斯消元法求解,对于其他形式方程这里暂不作讨论。
参考:https://leetcode-cn.com/leetbook/read/probability-problems