用d表示持有骰子的两玩家间的距离,也就是两者间劣弧的长度。首先作一个粗略的计算,容易看出,当d充分远离边界0和50时,每一轮中都有:
$d\mapsto d+2$和$d\mapsto d-2$都概率都是$1/36$(双方分别掷出1和6,共两种情况,其中一种是距离增加,另一种是距离减少)。
$d\mapsto d+1$和$d\mapsto d-1$都概率都是$2/9$(一方掷出2到5之间的数,另一方掷出1或6,取决于位置和以距离增还是减为目标)。
从而d不变的概率是$1/2$。
不过由于d不能小于0也不能大于50,因此在d靠近边界时需要分别调整上述概率,直接处理较为繁琐,因此将原问题转化为这样的一个等价的、圆环上的随机游走问题:
按顺序(比如顺时针)标记所有玩家,骰子从玩家50出发,每轮都分别有$1/36, 2/9, 1/2, 2/9, 1/36$的机会顺时针移动$2,1,0,-1,-2$步,求其到达玩家0的期望轮数。
记$x_k$为以玩家k为起点,到达玩家0所需要的期望轮数,则有初值$x_0=0$以及$k>0$时的关系式
$$x_k=1+\frac{1}{36}x_{k-2}+\frac{2}{9}x_{k-1}+\frac{1}{2}x_k+\frac{2}{9}x_{k+1}+\frac{1}{36}x_{k+2},$$
等式右侧下标中的加减法均在加法群$\mathbb Z_{100}$中运算。
以上可以改写为线性方程组:
$$A\vec x=\vec b$$
其中$\vec b\in\mathbb R^{100}$的第一项是0,其它项都是1,$\vec x=(x_0,\ldots,x_{99})^T$,$A\in\mathbb R^{100\times 100}$具有近似于circulant矩阵的结构,它的第一行是$(1,0,\ldots,0)$,第二行是$(-2/9,1/2,-2/9,-1/36,0,\ldots,0,-1/36)$,之后每一行都是前一行循环右移一格(circulant permutation)。
解此线性方程组即得结果$x_{50}=3780.618622$。
注:理解本解答中的术语需要一些基本的代数知识。
注2:以下为Python 3代码,因需要Scipy库来生成circulant矩阵并求解。
import scipy.linalg
A=scipy.linalg.circulant([1/2,-2/9,-1/36]+[0]*95+[-1/36,-2/9])
A[0][1]=A[0][2]=A[0][-1]=A[0][-2]=0
A[0][0]=1
x=scipy.linalg.solve(A,[0]+[1]*99)
print("%.6f" %(x[50]))
|