蒙特卡洛—赌博模型笔记

大数定理: 在随机事件的大量重复出现中,往往呈现几乎必然的规律,这个规律即大数定律。通俗说,这个定理就是在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。偶然中包含某种必然。

个人理解:蒙特卡洛就是一种根据制定好的规则基于不确定性不断演算得到结果的思想

单倍下注:
每次下注赌注不变,一直赌下去,代码如下

import random
import matplotlib.pyplot as plt

def rollDice():
    roll = random.randint(1,100)
    if roll == 100:
        return False
    elif roll <= 50:
        return False
    elif 100>roll>50:
        return True

def simple_bettor(funds,initial_wager,wager_count):
    value = funds           # 资金
    wager = initial_wager   # 赌注
    wX = []                 # wager X
    vY = []                 # value Y
    currentWager = 1
    while currentWager <= wager_count:
        if rollDice():
            value += wager
            wX.append(currentWager)
            vY.append(value)
        else:
            value -= wager
            wX.append(currentWager)
            vY.append(value)
        currentWager += 1
    plt.plot(wX,vY)         # 画图
    # 分类
    if value<=0:
        return "broke"
    elif value<funds:
        return "lose"
    elif value>funds:
        return "win"
    elif value==funds:
        return "equal"

x = 0
# 赌博人数
people = 100
# funds 赌金
funds = 10000
# 赌注
initial_wager = 100
# 模拟赌博次数
count = 1000

num_win = 0
num_lose = 0
num_broke = 0
num_equal = 0

while x < people:
    result = simple_bettor(funds,initial_wager,count)
    x += 1
    if result == 'win':
        num_win += 1
    elif result == 'lose':
        num_lose += 1
    elif result == 'broke':
        num_broke += 1
    elif result == 'equal':
        num_equal += 1

print("%d people are betting"%people)
print("people betting %d times"%count)
print("num_win:",num_win)
print("num_lose:",num_lose)
print("num_equal:",num_equal)
print("num_broke:",num_broke)
print("broken rate:",num_broke/people)

plt.ylabel("money in hand")
plt.xlabel("betting Count")
plt.show()

结果分析:根据大数定理,单倍下注赌久必输
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
双倍下注法:
破解大数定理,使用双倍下注
在下注过程中如果输了,则翻倍下注。
比如第一次下注10元输了,则第二轮下注20元
第二轮输了则下注40元。(万一赢了就会把之前输的赚回来)。在资源有限的情况下,这真是个好方法吗?

import random
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,10))
# 赌博人数
sampleSize = 100
# 赌资
startingFunds = 10000
# 每次赌金
wagerSize = 100
# 赌博次数
wagerCount = 30

def rollDice():
    roll = random.randint(1,100)
    if roll == 100:
        return False
    elif roll <= 50:
        return False
    elif 100>roll>=50:
        return True

def double_bettor(funds,initial_wager,wager_count):
    global double_busts
    global double_lose
    global double_profits
    value = funds           # 资金
    wager = initial_wager   # 赌注
    wX = []                 # wager X
    vY = []                 # value Y
    currentWager = 1
    previousWager = 'win'
    previousWagerAmount = initial_wager

    while currentWager <= wager_count:
        if previousWager == 'win':
            if rollDice():
                value += wager
                wX.append(currentWager)
                vY.append(value)
            else:
                value -= wager
                previousWager = 'loss'
                previousWagerAmount = wager     # 前一次赌注
                wX.append(currentWager)
                vY.append(value)
                if value < 0:
                    double_busts += 1
                    break
        elif previousWager == 'loss':
            if rollDice():
                wager = previousWagerAmount * 2
                if(value - wager) < 0:          # 钱不够时
                    wager = value
                value += wager
                wager = initial_wager
                previousWager = 'win'
                wX.append(currentWager)
                vY.append(value)
            else:
                wager = previousWagerAmount * 2
                if(value - wager) < 0:
                    wager = value
                value -= wager
                previousWager = 'loss'
                previousWagerAmount = wager
                wX.append(currentWager)
                vY.append(value)
                if value <= 0:
                    double_busts += 1
                    break
        currentWager += 1
    plt.plot(wX,vY)         # 画图
    # 分类
    if value>funds:
        double_profits += 1
    elif value<funds:
        double_lose += 1

def Print_result():
    print("总赌金:",startingFunds)
    print("开始每次赌金:",wagerSize)
    print("赌博次数:",wagerCount)
    print("赌钱人数:",sampleSize)
    print("Doubler Bettor Bust Chances:",(double_busts/sampleSize)*100.00)
    print("Doubler Bettor Profit Chances:",(double_profits/sampleSize)*100.00)
    print("Doubler Bettor Lose Chances:",(double_lose/sampleSize)*100.00)


x = 0
double_busts = 0.0
double_profits = 0.0
double_lose = 0.0

while x < sampleSize:
    double_bettor(startingFunds,wagerSize,wagerCount)
    x += 1

plt.axhline(0,color='r')
plt.ylabel("Account Value")
plt.xlabel("Wager Count")
Print_result()
plt.show()

结果分析:
在这里插入图片描述初看貌似是个好方法,真是这样?
在这里插入图片描述在这里插入图片描述可见随着次数的增多,破产率猛增

两种方法联合演示:

import random
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,10))
# 赌博人数
sampleSize = 100
# 赌资
startingFunds = 10000
# 每次赌金
wagerSize = 100
# 赌博次数
wagerCount = 30000

def rollDice():
    roll = random.randint(1,100)
    if roll == 100:
        return False
    elif roll <= 50:
        return False
    elif 100>roll>=50:
        return True

def double_bettor(funds,initial_wager,wager_count,color):
    global double_busts
    global double_profits
    value = funds           # 资金
    wager = initial_wager   # 赌注
    wX = []                 # wager X
    vY = []                 # value Y
    currentWager = 1
    previousWager = 'win'
    previousWagerAmount = initial_wager
    # 开始下注
    while currentWager <= wager_count:
        if previousWager == 'win':
            if rollDice():
                value += wager
                wX.append(currentWager)
                vY.append(value)
            else:
                value -= wager
                previousWager = 'loss'
                previousWagerAmount = wager     # 前一次赌注
                wX.append(currentWager)
                vY.append(value)
                if value < 0:
                    double_busts += 1
                    break
        elif previousWager == 'loss':
            if rollDice():
                wager = previousWagerAmount * 2
                if(value - wager) < 0:          # 钱不够时
                    wager = value
                value += wager
                wager = initial_wager
                previousWager = 'win'
                wX.append(currentWager)
                vY.append(value)
            else:
                wager = previousWagerAmount * 2
                if(value - wager) < 0:
                    wager = value
                value -= wager
                previousWager = 'loss'
                previousWagerAmount = wager
                wX.append(currentWager)
                vY.append(value)
                if value <= 0:
                    double_busts += 1
                    break
        currentWager += 1
    plt.plot(wX,vY,color)         # 画图
    # 分类
    if value>funds:
        double_profits += 1

def simple_bettor(funds,initial_wager,wager_count,color):
    global simple_busts
    global simple_profits
    value = funds           # 资金
    wager = initial_wager   # 赌注
    wX = []                 # wager X
    vY = []                 # value Y
    currentWager = 1
    # 开始下注
    while currentWager <= wager_count:
        if rollDice():
            value += wager
            wX.append(currentWager)
            vY.append(value)
        else:
            value -= wager
            wX.append(currentWager)
            vY.append(value)
            if value <= 0:
                simple_busts += 1
                break
        currentWager += 1
    plt.plot(wX,vY,color)         # 画图
    # 分类
    if value > funds:
        simple_profits += 1

def Print_result():
    print("总赌金:",startingFunds)
    print("开始每次赌金:",wagerSize)
    print("赌博次数:",wagerCount)
    print("赌钱人数:",sampleSize)
    print("Double Bettor Bust Chances:",(double_busts/sampleSize)*100.00)
    print("Simple Bettor Bust Chances:",(simple_busts/sampleSize)*100.00)
    print("Double Bettor Profit Chances:",(double_profits/sampleSize)*100.00)
    print("Simple Bettor Profit Chances:",(simple_profits/sampleSize)*100.00)


x = 0
# 双倍下注法
double_busts = 0.0
double_profits = 0.0
# 单倍下注法
simple_profits = 0.0
simple_busts = 0.0

while x < sampleSize:
    double_bettor(startingFunds,wagerSize,wagerCount,'c')
    simple_bettor(startingFunds, wagerSize, wagerCount,'k')
    x += 1

plt.axhline(0,color='r')
plt.ylabel("Account Value")
plt.xlabel("Wager Count")
Print_result()
plt.show()

运行结果:
在这里插入图片描述在这里插入图片描述当赌博次数很大时,双倍下注破产率大于单倍下注法,但不管怎么说,100个人中赢的人很少,所以珍爱生命远离赌博。

模型小白,望大佬批评指点。
参考:https://www.bilibili.com/video/BV17D4y1o7J2?from=search&seid=15046903514947720514

猜你喜欢

转载自blog.csdn.net/weixin_45666249/article/details/114783271