0227 追赶游戏
* * * *
拉格朗日计划
* * * *
追赶游戏

追赶游戏是一种需要偶数名玩家和两个骰子的游戏。

所有玩家在桌边坐成一圈,游戏开始时,选择两名相对而坐的玩家,每人拿一颗骰子。

每一轮中,拥有骰子的两名玩家掷出骰子。若玩家掷出点数1,则他将骰子交给他左侧的玩家;若掷出点数6,则他将骰子交给右侧的玩家;其余情况他均保留这颗骰子。

若某一轮结束时有一名玩家持有两颗骰子,则游戏结束,且该玩家输掉游戏。

若有100名玩家参与游戏,则游戏进行的期望轮数是多少?答案保留10位有效数字。

本题难度:



解答

用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]))