Python下无处遁形的赌场套路

加关注2.png

头图3.gif

栏目标题_07.png

 

 

转自 |数据团学社(微信搜索metrodata_xuexi 即可关注)

 

本文约2000字,阅读需要5分钟

关键词:蒙特卡洛模拟 Python 概率 赌城

本文用蒙特卡洛模拟讲述了赌城的一些套路→_→

 

今天,有个小伙伴神秘兮兮地问我:“有什么地方玩得好,吃得好,睡得好,而且不用花钱,最好还能赚钱?”

 

看着我一脸蒙圈的样子,小伙伴一本正经地给出了回答:“打个飞的去拉斯维加斯一趟,所有的博彩游戏,都离不开概率这一核心问题,所以只要了解概率是怎么一回事,那么一定能够制胜。”

 

咦,统计模拟方法不就是得名于著名赌城蒙特卡罗么!这设想简直棒呆!有概率论知识和蒙特卡罗模拟的技能傍身,幸运小转盘那么一转,小钱钱们排着队向我们招手!

 

 

话不多说,我们赶紧开始吧!

先看看一个简单的对赌游戏。

 

抛硬币游戏:正反两面概率各50%,正面你赢,反面庄家赢。每次下注1元,赔率1:1(净赔率,意思是下注1元,如果你赢了得2元,赢1元;输了,赔1元)。这是一个绝对公平的游戏,庄家和闲家胜率各半。

 

首先,我们模拟10位玩家,每位玩家赌本10元,进行100轮游戏,破产即退出,看看结果怎样。

 

'''
抛硬币游戏:
抛硬币,正反两面概率各50%,正面你赢,反面庄家赢。
10位玩家,赌本10元,进行100轮。
'''

sample_list = []
round_num = 100
person_num = 10
for person in range(1,person_num+1):
    gambling_money = 10
    for r in range(1,round_num+1):
        coin = random.randint(0, 1) # 0为正,1为反
        if coin == 0 :
            gambling_money = gambling_money + 1
        elif coin == 1 :
            gambling_money = gambling_money - 1
        if gambling_money == 0 :
            sample_list.append([person,r,gambling_money])
            break
        else:
            pass
    sample_list.append([person,r,gambling_money])

sample_data1 = pd.DataFrame(sample_list,columns=['person','round','gambling_money'])
sample_data1.to_csv('./十元赌本进行100轮游戏.csv',index=0)   

 

看下结果:

*从左到右分别是轮数排序,轮数,结束时持有金钱。

 

结果显示,赢得最多的玩家赢了24元,而有6位玩家宣告破产(红条),其中运气最差的只玩了28轮。

 

似乎感觉哪里有点不对~我们换个规则:

 

100位玩家,赌本10元,1000轮。

 

'''
抛硬币游戏:
抛硬币,正反两面概率各50%,正面你赢,反面庄家赢。
100位玩家,赌本10元,进行1000轮。
'''

sample_list = []
round_num = 1000
person_num = 100
for person in range(1,person_num+1):
    gambling_money = 10
    for r in range(1,round_num+1):
        coin = random.randint(0, 1) # 0为正,1为反
        if coin == 0 :
            gambling_money = gambling_money + 1
        elif coin == 1 :
            gambling_money = gambling_money - 1
        if gambling_money == 0 :
            sample_list.append([person,r,gambling_money])
            break
        else:
            pass
    sample_list.append([person,r,gambling_money])
sample_data2 = pd.DataFrame(sample_list,columns=['person','round','gambling_money'])
sample_data2.to_csv('./十元赌本进行1000轮游戏.csv',index=0)

 

结果奉上:

 

100位玩家中,只有24位玩家没有破产,第一幸运儿赢了10倍,而绝大多数玩家倾家荡产。

 

此刻,我那位萌萌哒的小伙伴陷入了困惑,问了一个很有哲理的问题:这是一个公平的游戏,但是看结果,我好像很大可能会破产?

 

再来!100位玩家,赌本10元,破产时结束游戏。

 

'''
抛硬币游戏:
抛硬币,正反两面概率各50%,正面你赢,反面庄家赢。
100位玩家,赌本10元,进行无限轮,直到破产。
'''

sample_list = []
person_num = 100
t1 = time.time()
for person in range(1,person_num+1):
    gambling_money = 10
    r = 0
    while gambling_money > 0 :
        r += 1
        print('进行第{}轮游戏'.format(r))
        coin = random.randint(0, 1) # 0为正,1为反
        if coin == 0 :
            gambling_money = gambling_money + 1
        elif coin == 1 :
            gambling_money = gambling_money - 1
        if gambling_money == 0 :
            sample_list.append([person,r,gambling_money])
            break
        else:
            pass
t2 = time.time()
t = round(t2 - t1,2)
print(t,'秒')    
sample_data3 = pd.DataFrame(sample_list,columns=['person','round','gambling_money'])
sample_data3.to_csv('./十元赌本进行无限轮游戏.csv',index=0)

 

结果是:

 

 

模拟结束。

 

最坚挺的玩家玩了28706轮,最懵逼的玩家只玩了10轮!

 

解释一下,意思就是这个人玩抛硬币游戏,连续抛10次,都是反面。而这一事件发生的概率是0.5的10次方= 1/1024,比千分之一的概率还小。

 

如下图所示:玩家平均在55轮宣告破产,在第256轮,有一半玩家破产,曲线随着轮数的增加趋于平缓,但无限向100%逼近。(增加样本数量可以使图更精确)

 

 

结果一出来,小伙伴怒了!怀疑我出老千。

 

好吧!为了公平起见,重新设置游戏规则如下:

100000位玩家,赌本10元,庄家赌本10元,对赌,直到一方破产。

 

聪明的你一定算出来了,双方破产的概率均为50%~来看看我有木有背地里出老千:

 

'''
抛硬币游戏:
抛硬币,正反两面概率各50%,正面你赢,反面庄家赢。
100000位玩家,赌本10元,庄家赌本10元,对赌,直到一方破产。
'''

sample_list = []
person_num = 100000
for person in range(1,person_num+1):
    gambling_money_dealer = 10
    gambling_money_player = 10
    r = 0
    while 1:
        r += 1
        print('第{}位玩家,进行第{}轮游戏'.format(person,r))
        coin = random.randint(0, 1) # 0为正,1为反
        if coin == 0 :
            gambling_money_player = gambling_money_player + 1
            gambling_money_dealer = gambling_money_dealer - 1
        elif coin == 1 :
            gambling_money_player = gambling_money_player - 1
            gambling_money_dealer = gambling_money_dealer + 1
        if (gambling_money_player == 0) or (gambling_money_dealer ==0):
            sample_list.append([person,gambling_money_dealer,gambling_money_player,r])
            break
sample_data4 = pd.DataFrame(sample_list,columns=['person','dealer','player','round'])
sample_data4.to_csv('./庄家和闲家各十元赌本对赌直到一方破产.csv',index=0)

 

结果是50150个庄家破产,49850个玩家破产,符合预期。说明模拟是正确的,那么问题在哪呢?

 

重新玩:100000位玩家,赌本10元,庄家赌本20元,对赌,直到一方破产。

这回,我们给庄家20元赌本,看看会发生什么?

 

'''
抛硬币游戏:
抛硬币,正反两面概率各50%,正面你赢,反面庄家赢。
100000位玩家,赌本10元,庄家赌本20元,对赌,直到一方破产。
''' 

sample_list = []
person_num = 100000
for person in range(1,person_num+1):
    gambling_money_dealer = 20
    gambling_money_player = 10
    r = 0
    while 1:
        r += 1
        print('第{}位玩家,进行第{}轮游戏'.format(person,r))
        coin = random.randint(0, 1) # 0为正,1为反
        if coin == 0 :
            gambling_money_player = gambling_money_player + 1
            gambling_money_dealer = gambling_money_dealer - 1
        elif coin == 1 :
            gambling_money_player = gambling_money_player - 1
            gambling_money_dealer = gambling_money_dealer + 1
        if (gambling_money_player == 0) or (gambling_money_dealer ==0):
            sample_list.append([person,gambling_money_dealer,gambling_money_player,r])
            break
sample_data5 = pd.DataFrame(sample_list,columns=['person','dealer','player','round'])
sample_data5.to_csv('./庄家二十元赌本和闲家十元赌本对赌直到一方破产.csv',index=0)          

 

结果如下:

 

庄家有66723个获胜,玩家有33277个获胜。获胜比例约为2:1。这和双方的赌本比例一致

 

我们可爱的小伙伴激动了~ 他说,我已经透过现象,洞穿了其中的本质:在赌桌上打倒对方的概率为:我的钱/大家的钱

 

好吧~这么浅显的东西其实早有人总结出来了:赌徒输光定理。在绝对公平的赌博游戏中,最终获胜的概率和双方的资金有关,公式为a/a+b。可以推断:如果一方拥有无限的资金,那么其获胜概率为100%,另一方破产的概率为100%。

 

 

在真实环境中,无限是不存在的,但是我想以你那点微薄的赌资和赌场庞大的资本相比,其实也区别不大了。

 

 

不过,总有那么些人,1个亿是小目标,5个亿是零花钱,50个亿是中等意思,这些人来到赌场一掷千金,赌场是不是会破产?

诶~又天真了。赌场说,我提供你免费的场地玩,免费的房间睡,还有免费的好吃的,你如果赢钱了,就稍微意思意思嘛,比如给我个2%当佣金

 

好!某人带着他的小目标就这样玩起了我们喜闻乐见的抛硬币游戏:

 

正反两面概率各50%,正面你赢,反面庄家赢。

玩家获胜,庄家会抽取2%作为抽成。

模拟100W轮。

 

'''
抛硬币游戏:
抛硬币,正反两面概率各50%,正面你赢,反面庄家赢。
玩家获胜,庄家会抽取2%作为抽成。
模拟100W轮
'''

sample_list = []
gambling_money_dealer = 0
gambling_money_player = 0
for i in range(1,1000000+1):
    print('正在进行第{}轮游戏'.format(i))
    coin = random.randint(0, 1) # 0为正,1为反
    if coin == 0 :
        gambling_money_player = gambling_money_player + 0.98
        gambling_money_dealer = gambling_money_dealer - 0.98
    elif coin == 1 :
        gambling_money_player = gambling_money_player - 1
        gambling_money_dealer = gambling_money_dealer + 1
    sample_list.append([i,gambling_money_dealer,gambling_money_player])
sample_data6 = pd.DataFrame(sample_list,columns=['round','dealer','player'])
sample_data6.to_csv('./庄家抽取2%抽成.csv',index=0)        

 

我相信在1,000,000轮的模拟之下,任何套路都无处可藏!

结果是这样的:

 

 

解释一下:2%虽然微小,但却让原本公平的游戏变得不公平,赌场有了2%的优势率。虽然很小,但奠定了胜局。这就是我们常说的大数法则:在随机现象的大量重复中往往出现几乎必然的规律。

 

柯尔莫哥洛夫强大数律:若 为独立同分布随机变量序列,存在,则以概率1成立

 

如果对数学过敏,直接看结果:

赌场最终获利0.02*A,所以,只要概率占优,最后获利只跟你总的下注大小有关。

一句话总结:赌的越多,输的越多,十赌九输,久赌必输。

 

所以说,世界上从来都没有天上掉馅饼的好事,有的只是一夜暴“负”的套路。

 

那么,究竟有什么地方人少,玩得好,吃得好,睡得好,不用花钱,最好还能赚钱?

 

 

 

 

 

 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值