Python下無處遁形的賭場套路

資料團學社發表於2018-11-12

本文約2000字,閱讀需要5分鐘

關鍵詞:蒙特卡洛模擬 Python 機率 賭城

本文用蒙特卡洛模擬講述了賭城的一些套路→_→

今天,有個小夥伴神秘兮兮地問我:“有什麼地方玩得好,吃得好,睡得好,而且不用花錢,最好還能賺錢?”

看著我一臉蒙圈的樣子,小夥伴一本正經地給出了回答:“打個飛的去拉斯維加斯一趟,所有的博彩遊戲,都離不開機率這一核心問題,所以只要瞭解機率是怎麼一回事,那麼一定能夠制勝。”

咦,統計模擬方法不就是得名於著名賭城蒙特卡羅麼!這設想簡直棒呆!有機率論知識和蒙特卡羅模擬的技能傍身,幸運小轉盤那麼一轉,小錢錢們排著隊向我們招手!

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(01# 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)   

看下結果:

Python下無處遁形的賭場套路

*從左到右分別是輪數排序,輪數,結束時持有金錢。

結果顯示,贏得最多的玩家贏了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(01# 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)

結果奉上:

Python下無處遁形的賭場套路

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(01# 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)


結果是:

Python下無處遁形的賭場套路

模擬結束。

最堅挺的玩家玩了28706輪,最懵逼的玩家只玩了10輪!

解釋一下,意思就是這個人玩拋硬幣遊戲,連續拋10次,都是反面。而這一事件發生的機率是0.5的10次方= 1/1024,比千分之一的機率還小。

如下圖所示:玩家平均在55輪宣告破產,在第256輪,有一半玩家破產,曲線隨著輪數的增加趨於平緩,但無限向100%逼近。(增加樣本數量可以使圖更精確)

Python下無處遁形的賭場套路

結果一出來,小夥伴怒了!懷疑我出老千。

好吧!為了公平起見,重新設定遊戲規則如下:

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(01# 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 == 0or (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(01# 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 == 0or (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%。

Python下無處遁形的賭場套路

在真實環境中,無限是不存在的,但是我想以你那點微薄的賭資和賭場龐大的資本相比,其實也區別不大了。

Python下無處遁形的賭場套路

不過,總有那麼些人,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(01# 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輪的模擬之下,任何套路都無處可藏!

結果是這樣的:

Python下無處遁形的賭場套路

解釋一下:2%雖然微小,但卻讓原本公平的遊戲變得不公平,賭場有了2%的優勢率。雖然很小,但奠定了勝局。這就是我們常說的大數法則:在隨機現象的大量重複中往往出現幾乎必然的規律。

柯爾莫哥洛夫強大數律:若Python下無處遁形的賭場套路 為獨立同分布隨機變數序列,Python下無處遁形的賭場套路存在,則以機率1成立Python下無處遁形的賭場套路

如果對數學過敏,直接看結果:

賭場最終獲利0.02*A,所以,只要機率佔優,最後獲利只跟你總的下注大小有關。

一句話總結:賭的越多,輸的越多,十賭九輸,久賭必輸。

所以說,世界上從來都沒有天上掉餡餅的好事,有的只是一夜暴“負”的套路。

那麼,究竟有什麼地方人少,玩得好,吃得好,睡得好,不用花錢,最好還能賺錢?

Python下無處遁形的賭場套路

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31558017/viewspace-2219664/,如需轉載,請註明出處,否則將追究法律責任。

相關文章