ルーレットの必勝法をプログラミングしてみました。

結果を先に言います。一文無しになりました。


ルーレットでギャンブルをします。ルーレットは38の目があり、18つが赤色、18つが黒色、2つが緑色をしています。赤か黒に賭けることができ(まあ緑でもいいのでしょうが)、当たったら掛け金が2倍になって返ってきます。負けたら0。確率18/38で勝ち、20/38で負けます。本場のルーレットもこの仕組みのはずです。さて、勝ちに行きましょう。


戦略は、まず100万ドル持っていて、100ドルかける。負けたら101ドル賭けて負けを取り返しに行く。また負けたら201ドル負けてるんで202ドル賭ける。買ったら掛け金は100ドルに戻す。理論的には負けるけど、感情的には勝てそうだ。さあ、レッツシミュレーション!

ソースコードはじまり】★★★
#include
#include //rand

//■ルーレット
int roulette(int bet_money){

int rand_number = rand()%38;

printf("i bet %d dollars!!\n",bet_money);

if(rand_number <= 19){//loss
bet_money = 0;
}
else{bet_money = 2 * bet_money;}//win

printf("i get %d dollars!!\n",bet_money);

return bet_money;
}

//■メイン
void main(){
printf("hello!\n");

int my_money = 1000000;
int bet_money = 100;
int get_money = 0;
int maketeru_money = 0;//今、負けている金額

int kati_suu = 0;//勝った数
int make_suu = 0;//負けた数

float win_rate;// 18/38に収束するはず(0.47368...)

while(my_money >= 0){//金があるうちはループ
my_money = my_money - bet_money;//まず、お金を賭けます
get_money = roulette(bet_money);
if(get_money == 0){//負けたとき
make_suu++;
maketeru_money = maketeru_money + bet_money;
bet_money = maketeru_money + 1;//次回で取り返す金額を賭ける
}
else{//買ったとき(100万円を越えてる)
kati_suu++;
my_money = my_money + get_money;
printf("my money = %d!!\n",my_money);
bet_money = 100;//また100ドルから賭けはじめる
maketeru_money = 0;//買ったんだから「負けている金額」はない
}
win_rate = kati_suu/(float)(kati_suu + make_suu);
printf("win_rate is %f!!\n",win_rate);
}

return;
}

ソースコードおわり】★★★

勝率は0.473923となり、理論値の勝率0.47368...とかなり近くなりました。大数の法則ってやつですかね。やっぱり負けてしまいました。負けて負けて、負けを取り返すために掛け金が2倍2倍に増えていき、負けが恐ろしく続いたところで負けました。100万ドル持っていて、250万とかまで増えたけど、最後には負けた。200万まで増えたところで100万ずつに分割して、同じ戦略を取ると、、、破産の確率も2倍になるからやっぱり破産は避けられない。やっぱり理論にはかなわないや。勝ち続けているときは「理論を越えたぜ!」と思いましたが、ひっくり返されました。よし、僕は理論家になる!じゃあ私はWebデザイナーよ!って感じでした。今、大学学部4年で、理論ばかりやってるわけですが、理論の強さをあらためて感じ、理論を学ぶモチベーションが増えた今日でした。ちゃんちゃん。