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


看下結果:

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


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


結果奉上:


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)


結果是:



模擬結束。


最堅挺的玩家玩了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(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%。



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



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

結果是這樣的:



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


柯爾莫哥洛夫強大數律:若 爲獨立同分布隨機變量序列,存在,則以概率1成立


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

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

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


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


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









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章