Python实现马尔科夫赌徒问题(等概率)

目录

问题描述

一、问题抽象

二、操作步骤

1.引入库

2.实现函数

3.示例计算

总结

本文参考


问题描述

        玩家和庄家对赌硬币,如果正面朝上,本轮玩家赢,庄家付给玩家 ⼀元;如果反面朝上,本轮玩家输,玩家付给庄家⼀元。假设玩家 ⼿上有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)


 

 

 

 

 

 

 


总结

        通过示例可以看出,在等概率的情况下,赌局的数量越来越多,玩家的胜场与输场就越来越少,退场的数量越来越多。其本质就是一个马尔科夫状态转移矩阵,最终概率会趋近于一个稳定值。


本文参考

  1. Gambler's Ruin Problem(赌徒破产问题)研究总结 - 简书 (jianshu.com)
  2. hdu1204(Markov过程,赌徒输光问题变形)_从状态i出发在状态0之前到达状态n的概率_pmt123456的博客-CSDN博客
  3. 赌徒输光问题介绍.ppt (book118.com)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值