大数定理: 在随机事件的大量重复出现中,往往呈现几乎必然的规律,这个规律即大数定律。通俗说,这个定理就是在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。偶然中包含某种必然。
个人理解:蒙特卡洛就是一种根据制定好的规则基于不确定性不断演算得到结果的思想
单倍下注:
每次下注赌注不变,一直赌下去,代码如下
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