#(追記)ごめんなさい!
np.random.randintとrandom.randintの結果が異なり、
カジノでは負けてしまうことが判明しました。詳しくは:
https://qiita.com/mnoda/items/a75d350e1aa432eaf4f3
#(Pythonで)カジノで勝てる方法を見つけた気がする。。。これはいけるぞ!
最近Qiitaで競馬のAI賭けが話題になっているが別の角度でプログラムを組んでみた。プログラミングの「プロ」では無いのだが、自分で作っていて何か怖くなってきた。
カジノでどのようにベットすればいいかは永遠のテーマのような気がするが、自分がプレイする際は自分なりの解を見つけた気がする。というのもPythonで(別の言語でも良いのですが・・・)検証したところ、プレイの回数を増やせば増やすほどリターンが増えるようにしか見えないから。
モンテカルロという手法やマーチンゲールといった方法を見かけるが、問題なのは負けが続いた場合に一回あたりの損害が大きくなりすぎるのと長期的には損失が発生しやすいことが問題だ。この二つのプレイ方法は(Qiitaも参考にしながらPythonでやってみても)特に損する場合において収支があまり魅力的には見えなかった。とにもかくにもモンテカルロの問題は数字の管理が面倒なのと負けが続くと雪だるま式に掛け金が増えること。マーチンゲールも同じような問題を抱えている。そこで、新たなモデルの創出を自分なりに考えてみた。
#プレイの条件、作成したプログラムの条件
●所持金は無限にあるわけではない。庶民が準備できる金額をセットできること。所持金を下回ればゲームオーバーにする。
●$1をベースとして検証するが、1回あたりの掛け金の倍率を指定できるようにする(プログラム中ではMultiplierという変数に指定している)
※逆にいうと所持金を増やさず倍率を増やすとゲームオーバーになることが増えることも確認できる。ほとんどのプレイヤーは何も考えずにこのパターンに陥っている気がする。
●プログラムの処理では7回連続で負けたら終わり。$1スタートでも一ターンの負け続けた際の最大の損失は$20。これなら庶民的な気がする。
●どのターンでも勝てば必ず何か入る。
●トリプル、ダズンベットに賭ける(倍返しのイブンベットではなくダズンベットに賭ける、その理由はある程度儲けるわりに負け続けた場合の損を食い止めることができそうだから)。
●7回連続して負けて$20($1->$1->$1.5->$2->$3->$4.5->$7)負けるかどこかで勝ったら再度$1からスタート。Pythonの実行結果でも、プレイ回数が多ければ7回連続で負けるのは全体の5%程度になることがわかる。逆にいうと全体の5%程度(ユーロピアンルーレットで概ね0.676の7乗)は$20が損となるが、95%のケースでは何かしらのリターンが入るという構図。マーチンゲールになると7回負けて$127だからイブンベットからダズンベットでさほど勝てる比率は下げていないにもかかわらず連続負けの際のロスを低くしていることがお分かりいただけると思う。
#Google Colaboratoryでの検証結果
●所持金$1,000, 賭け倍率x$1の場合, 回数が概ね10,000回超えの場合、収支がマイナスになることはゼロではないはずだがかなり限定的に見えます(というか、私はなったことが無いです)。1万回や10万回とプレイ回数を増やせば増やすほど右肩上がりの収支に見えます。(ゲームオーバーになるのは難しい、なったとしてもこの設定値なら最大でも$1,000の損だし・・・)
●回数を増やせば増やすほど収支のプラスが右肩上がりに見えるのは気のせい?
あくまで結果はシステム上でのシミュレーションです。
プログラムにバグがある可能性があります。
実際に賭けることを勧めていません。
何があっても責任を負えません。
モンテカルロやマーチンゲールよりすごい!ということで、カジノに出入り禁止になっても苦情は受け付けられませんので、あしからず(笑)。
Google Colaboratory 検証用ソースコード:
import random
#from collections import Counter
#import numpy as np
#import scipy as sp
#import pandas as pd
#import matplotlib.pyplot as plt
#所持金
money=1000
#ゲーム数
n=10000
#毎回の掛け金
multiplier=1
count=0
print('Start$:'+str(money))
Win1=0
Win2=0
Win3=0
Win4=0
Win5=0
Win6=0
Win7=0
Lose=0
TotalWin=0
TotalLose=0
while count in range (n) and money>0:
if random.randint(0,37) >= 25:
money -= 1*multiplier
money += 3*multiplier
Win1+=1
TotalWin+=(3-1)*multiplier
elif random.randint(0,37) >= 25:
money -= (1+1)*multiplier
money += 3*multiplier
Win2+=1
TotalWin+=(3-1-1)*multiplier
elif random.randint(0,37) >= 25:
money -= (1.5+(1+1))*multiplier
money += 4.5*multiplier
Win3+=1
TotalWin+=(4.5-1.5-1-1)*multiplier
elif random.randint(0,37) >= 25:
money -= (2+(1.5+1+1))*multiplier
money += 6*multiplier
Win4+=1
TotalWin+=(6-2-1.5-1-1)*multiplier
elif random.randint(0,37) >= 25:
money -= (3+(2+1.5+1+1))*multiplier
money += 9*multiplier
Win5+=1
TotalWin+=(9-3-2-1.5-1-1)*multiplier
elif random.randint(0,37) >= 25:
money -= (4.5+(3+2+1.5+1+1))*multiplier
money += 13.5*multiplier
Win6+=1
TotalWin+=(13.5-4.5-3-2-1.5-1-1)*multiplier
elif random.randint(0,37) >= 25:
money -= (7+(4.5+3+2+1.5+1+1))*multiplier
money += 21*multiplier
Win7+=1
TotalWin+=(21-7-4.5-3-2-1.5-1-1)*multiplier
else:
money -= (7+(4.5+3+2+1.5+1+1))*multiplier
Lose+=1
TotalLose+=(7+4.5+3+2+1.5+1+1)*multiplier
count+=1
print('Final$:'+str(money))
print('')
print('n:'+str(n))
print('Bet Multiplier$: '+str(multiplier))
print('TotalWin$:'+str(TotalWin))
print('TotalLose$:'+str(TotalLose))
print('')
print('Win1:'+str(Win1)+'-'+str(round(Win1/n*100))+'%')
print('Win2:'+str(Win2)+'-'+str(round(Win2/n*100))+'%')
print('Win3:'+str(Win3)+'-'+str(round(Win3/n*100))+'%')
print('Win4:'+str(Win4)+'-'+str(round(Win4/n*100))+'%')
print('Win5:'+str(Win5)+'-'+str(round(Win5/n*100))+'%')
print('Win6:'+str(Win6)+'-'+str(round(Win6/n*100))+'%')
print('Win7:'+str(Win7)+'-'+str(round(Win7/n*100))+'%')
print('Lose:'+str(Lose)+'-'+str(round(Lose/n*100))+'%')
print('Total Game:' + str(Win1+Win2+Win3+Win4+Win5+Win6+Win7+Lose))
print('Max $20 each turn ($1->$1->$1.5->$2->$3->$4.5->$7)*multiplier')