摘要

  分赌注问题又称为点数问题,是法国学者梅雷于 1654 年向法国数学家帕斯卡提出的。
  该问题简单来说就是两个水平相同的赌徒 A 和 B,约定先胜 $t$ 局的人赢得赌注,在赌局中的某时刻,两赌徒终止赌博,此时 A 胜 $r$ 局,B 胜 $s$ 局,应该如何合理分配赌注。赌注问题不仅成为概率论的起源,同时荷兰数学家惠更斯在此基础上撰写《论赌博中的计算》一书,提出了数学期望的概念,推动了概率论的发展。
  本文用理论分析运算得出赌注分配的最佳方案,并采用 MATLAB 仿真实验验证结果的正确性。

一、问题假设

  • 假设先胜 18 局的人赢得赌注,且在 A 胜 10 局且 B 胜 7 局的时候终止赌博;
  • 假设赌徒 A 和 B 的胜率相同,即每一局 A 和 B 都有 0.5 的机会赢得胜利;
  • 由于 $r$ 和 $s$ 的大小不影响问题的讨论,不妨假设 $r > s$。
符号 符号说明
$t$ 获得赌注需要获胜的次数
$r$ A 已经获胜的次数
$s$ B 已经获胜的次数
$P_A$ A 先获胜 $t$ 局的概率
$P_B$ B 先获胜 $s$ 局的概率
$P_a$ A 获胜一局的概率
$P_b$ B 获胜一局的概率
$i$ 比赛结束时的比赛次数
$P_{A\left( i \right)}$ 进行到第 $i$ 局时 A 先获胜 $t$ 局的概率

二、问题分析

  当终止赌博时,A 胜 $r$ 局,B 胜 $s$ 局,那么此时 A、B 两人中任何一人若要赢得 $t$ 次的胜利,最少需要的局数为 $t-r$ 局,最多需要的局数为 $2t-r-s-1$ 局,即有:

$t-r\leqslant i\leqslant 2t-r-s-1$
  而通过分析我们可以知道,A 要想赢得赌注,他必须要再赢 $t-s$ 局;同样,B 要想赢得赌注,他必须要再赢 $t-r$ 局,那么问题便可以转化为 A 再赢 $t-r$ 局或 B 再赢 $t-s$ 局先发生的概率,由于结果要么 A 赢得赌注,要么 B 赢得赌注,这两个概率是互补的,因此可以得到:
$P_A+P_B=1$
  由二项分布可以得出,当进行到了第 $i$ 局时,A 先获胜 $t$ 局的概率为:
$P_{A\left( i \right)}=C_{i-1}^{t-r-1}P_{a}^{t-r-1}P_{b}^{i-1-\left( t-r-1 \right)}*P_a$
  那么对每一局的概率进行求和便可得出 A 先获胜 $t$ 局的概率为:
$P_A=\sum_{i=t-r}^{2t-r-s-1}{P_{A\left( i \right)} }$
  联立上述式子,并结合已知条件,可以得到:
$\begin{cases} t=18\\ r=10\\ s=7\\ P_A+P_B=1\\ P_a=P_b=0.5\\ P_{A\left( i \right)}=C_{i-1}^{t-r-1}P_{a}^{t-r-1}P_{b}^{i-1-\left( t-r-1 \right)}*P_a\\ P_A=\sum_{i=t-r}^{2t-r-s-1}{P_{A\left( i \right)} }\\ \end{cases}$

三、问题求解

  1. 编写 MATLAB 程序,对上述方程组进行求解:
      通过计算得出理论值为:$P_A = 0.7597$。
      因此 A 应该赢得 75.97% 的赌注,B 应该赢得 24.03% 的赌注。
  2. 利用 MATLAB 仿真实验对理论结果进行验证:
      假设 MATLAB 中 2 * rand () 产生的随机数大于 1 则认为单局赌博 A 获胜,否则 B 获胜。以 A 获胜次数 / 仿真次数为 A 获胜的频率,得到仿真结果如下表:
表 1 仿真结果统计表
仿真次数 10 100 1000 10000
A 获胜的频率 0.8000 0.7700 0.7530 0.7596

  可以看出,当仿真次数为 10000 次时,A 获胜的频率为 0.7596,与理论计算的结果相符合,印证了本文采取的计算方法的正确性。

四、参考文献

[1] 张卓奎,陈慧婵.《概率论与数理统计》. 西安电子科技大学出版社. 2014.6

五、附录

求解代码
clc;clear
t = 18;
r = 10;
s = 7;
p_a = 0.5;
P_A = P(t - r,t - s, p_a)
%定义 n = t - r; m = t - s
function sum = P(n, m, p)
sum = 0;
for i = n : n + m - 1
sum = sum + nchoosek(n + m - 1, i) * p^(i) * (1 - p)^(n + m - 1 - i);
end
end
仿真代码
clear;clc
t = 18;
r = 10;
s = 7;
cout = 10000;
cout_a = 0;
cout_b = 0;
for i = 1 : cout
i_a = r;
i_b = s;
while i_a < t && i_b < t
if(2 * rand() > 1)
i_a = i_a + 1;
else
i_b = i_b + 1;
end
end
if i_a == t
cout_a = cout_a + 1;
else
cout_b = cout_b + 1;
end
end
P_A = cout_a / cout