摘要

  分赌注问题又称为点数问题,是法国学者梅雷于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