公平与有偏硬币游戏中,直至某面领先指定次数的期望抛掷次数求解
咱们先把问题明确下来:
给定一枚公平硬币,求需要抛掷多少次,才能让正面次数比反面多$a$次,或者反面次数比正面多$b$次?这个抛掷次数的期望值是多少?另外,如果换成有偏硬币(正面概率为$p$,反面为$1-p$),有没有通用的解析公式?
一、直接构建线性方程组的常规思路
最直接的方法是用递推关系建立线性方程组:
设$x_i$表示当前正面比反面多$i$次时,还需要抛掷的期望次数。
对于还没结束的中间状态(也就是$-b+1 \leq i \leq a-1$),每抛一次,有50%概率正面朝上(状态变成$i+1$),50%概率反面朝上(状态变成$i-1$),同时这次抛掷消耗了1次,所以递推式是:
$$x_i = 1 + \frac{1}{2}x_{i+1} + \frac{1}{2}x_{i-1}$$
边界条件很好理解:当正面已经领先$a$次($x_a$),或者反面领先$b$次($x_{-b}$)时,游戏直接结束,不需要再抛了,所以:
$$x_{-b} = x_a = 0$$
这样我们就得到了一个包含$a+b+1$个未知数的线性方程组。虽然可以用软件数值求解,但手动解的话要处理大矩阵,有点麻烦——那有没有更简便的解析方法?
二、更简洁的解析解
1. 公平硬币的情况($p=\frac{1}{2}$)
我自己试了好几组公平硬币的实验,发现结果全是整数!比如当$a=b=n$时,期望值正好是$n^2$。
其实对于任意的$a$和$b$,公平硬币下的期望抛掷次数就是**$a \times b$**——是不是特别简洁?比如$a=30$、$b=20$的话,结果就是$30\times20=600$,和用代码跑出来的结果完全一致。
2. 有偏硬币的情况($p \neq \frac{1}{2}$)
对于有偏的情况,咱们也有通用的解析公式:
先定义$r = \frac{1-p}{p}$(也就是反面概率和正面概率的比值),那么游戏结束时的期望抛掷次数可以写成:
$$\frac{a(1 - r^b) + b(r^a - 1)}{(1-p)(1 - r^{a+b})} - \frac{a + b}{1 - 2p}$$
或者整理成更直观的形式:
$$\frac{a}{1-2p} \cdot \frac{1 - \left(\frac{1-p}{p}\right)^b}{1 - \left(\frac{1-p}{p}\right)^{a+b}} + \frac{b}{2p-1} \cdot \frac{1 - \left(\frac{p}{1-p}\right)^a}{1 - \left(\frac{p}{1-p}\right)^{a+b}}$$
这个公式是通过求解递推方程得到的:把原递推式$x_i = 1 + p x_{i+1} + (1-p)x_{i-1}$变形为线性非齐次递推关系,先求齐次解再找特解,结合边界条件就能推导出这个结果。
三、数值求解的Mathematica代码
如果不想手动推导,也可以用代码直接解方程组,这里给一份可以直接运行的Mathematica代码:
ExpectedTosses[p_, a_, b_] := Module[{equations, boundaryConditions, solution}, equations = Table[X[i] == 1 + p (X[i + 1]) + (1 - p) (X[i - 1]), {i, -b + 1, a - 1}]; boundaryConditions = {X[a] == 0, X[-b] == 0}; solution = Solve[Join[equations, boundaryConditions], Table[X[i], {i, -b, a}]]; Print[solution]; X[0] /. solution[[1]] ]; (* 示例:公平硬币,a=30,b=20 *) ExpectedTosses[1/2, 30, 20]
运行这个示例的话,会输出600,正好对应$30\times20$的结果。
备注:内容来源于stack exchange,提问作者maplemaple




