目录
问题描述
玩家和庄家对赌硬币,如果正面朝上,本轮玩家赢,庄家付给玩家 ⼀元;如果反面朝上,本轮玩家输,玩家付给庄家⼀元。假设玩家 ⼿上有10元硬币,⼿上钱⼀旦输光则退出游戏。
注:不考虑庄家输赢,只考虑玩家输赢;赌完一定局数后,仍然有10元硬币属于“Win”。
一、问题抽象
转换为马克科夫状态转移矩阵
二、操作步骤
1.引入库
代码如下:
import matplotlib.pyplot as plt
import random
2.实现函数
代码如下:
def Gambler_Ruin(num, num_r, num_p):
Quit, Win, Loss, j = 0, 0, 0, 0
num_c1 = num
bb = [-1, 1]
# num_c 赌徒的初始金币数量
# num_r 回合次数
# num_p 人数
for i in range(1, num_p):
while j < num_r:
# 赌徒 随机胜负
num_c1 += bb[random.randint(0, 1)]
j += 1
# 退局判断
if num_c1 <= 0:
Quit += 1
break
# 败局判断
if 0 < num_c1 < 10:
Loss += 1
# 胜局判断
if num_c1 >= 10:
Win += 1
j = 0
num_c1 = num
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示中文
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
X_data = ['退场', '胜场', '输场']
Y_data = [Quit, Win, Loss]
plt.style.use('ggplot') # 添加网格线
tit = str("回合数 " + str(num_r) + ",人数=" + str(num_p))
plt.title(tit) # 柱状图标题
plt.xlabel("结果") # X轴名称
plt.ylabel("# 人数") # Y轴名称
plt.bar(X_data, Y_data, color="blue") # 绘制柱状图
return plt.show() # 显示柱状图
3.示例计算
代码如下:
if __name__ == '__main__':
Gambler_Ruin(10, 30, 10000)
Gambler_Ruin(10, 50, 10000)
Gambler_Ruin(10, 100, 10000)
Gambler_Ruin(10, 200, 10000)
Gambler_Ruin(10, 300, 10000)
Gambler_Ruin(10, 500, 10000)
Gambler_Ruin(10, 1000, 10000)
总结
通过示例可以看出,在等概率的情况下,赌局的数量越来越多,玩家的胜场与输场就越来越少,退场的数量越来越多。其本质就是一个马尔科夫状态转移矩阵,最终概率会趋近于一个稳定值。