Python下無處遁形的賭場套路
本文約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,所以,只要機率佔優,最後獲利只跟你總的下注大小有關。
一句話總結:賭的越多,輸的越多,十賭九輸,久賭必輸。
所以說,世界上從來都沒有天上掉餡餅的好事,有的只是一夜暴“負”的套路。
那麼,究竟有什麼地方人少,玩得好,吃得好,睡得好,不用花錢,最好還能賺錢?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31558017/viewspace-2219664/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 掌握 API 介面,讓車輛故障資訊無處遁形的訣竅API
- 華為雲災備,讓資料風險無處遁形
- 如果買量市場需要版號,60%的遊戲下架、45%的馬甲包無所遁形遊戲
- LikeLib“區塊鏈+數字版權” 讓盜版無處遁形區塊鏈
- 照妖鏡奈米“相機”:讓反應歷程無處遁形
- 微步OneSEC讓新型威脅無所遁形
- RFID在食品供應鏈安全保障體系的應用,假冒偽劣產品將無處遁形
- 命令讓redis服務端所有資訊無所遁形Redis服務端
- 找工作太難?軟體測試職場套路太深?來來這些生存套路瞭解一下!
- Go語言精進之路讀書筆記第45條——使用模糊測試讓潛在bug無處遁形Go筆記
- Docker:一場令人追悔莫及的豪賭Docker
- iOS下 建立遠端cocoapods私有庫的套路iOS
- 面對“套路貸”借貸寶是如何處理的?
- 職場有一種套路叫“格局”
- 『無為則無心』Python基礎 — 16、Python序列之字串的下標和切片Python字串
- Spring Boot 中關於自定義異常處理的套路!Spring Boot
- 影片場景下的自然語言處理應用自然語言處理
- Mac環境下MySQL無法啟動的處理方法MacMySql
- 祂無處不在 -- 疾病的處理.
- 回顧2019,日本遊戲市場上的中國“套路”遊戲
- 一個命令讓redis服務端所有資訊無所遁形~(收藏吃灰系列)Redis服務端
- 視訊場景下的自然語言處理應用自然語言處理
- 資訊流廣告被套路卻無可奈何
- 談下python微服務中的序列化場景Python微服務
- miRNA常用的套路
- webpack loader的"套路"Web
- webpack loader的”套路”Web
- 炒股軟體Robinhood市值超越傳統賭場
- 『無為則無心』Python日誌 — 67、logging日誌模組處理流程Python
- 四步就能設計電商主圖的方法!無套路教學!
- Python 的編譯器geany-1.36無法下載問題Python編譯
- Python學習之Craps賭博遊戲篇Python遊戲
- 網店開設教程免費分享,無套路乾貨分享!
- 黑客利用魚缸溫度計竊取了賭場的資料庫黑客資料庫
- 『無為則無心』Python函式 — 37、Python中的包Python函式
- 『無為則無心』Python序列 — 23、Python序列的公共APIPythonAPI
- 『無為則無心』Python序列 — 20、Python中的元組Python
- 『無為則無心』Python基礎 — 7、Python的變數Python變數