Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

倍プッシュのシミュレーション

ギャンブルで負けた時に賭け金を倍にして取り返そうとする「倍プッシュ」という賭け方があります。倍々に賭けていけばその内いつか勝って負けを取り戻せるように思えますが、手持ちの資金が無くなったら終わりなので大負けする可能性もあります。以下のルールで「倍プッシュ」にどのくらいの可能性があるのかをシミュレートします。

  • 設定した金額を賭ける
  • 勝つ確率は1/2
  • 勝った場合は賭け金が戻った上で賭け金と同額がもらえる。負けた場合は賭け金を失う。
  • 勝った場合も負けた場合も前回の倍の金額を賭ける
  • 目標額に達成した場合または次の賭け金が払えなくなった場合終了
環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • matplotlib 3.2.1
コード

始めの持ち金を10000、最初の賭け金を100、目標金額を20000として計算します。勝ち負けはリストgameに 0、掛金×2 の2つの値を持たせてrandom.choiceでランダムにどちらかを選択しています。

import random

def baipush(money0, bet1, target):
    count = 0
    bet = bet1
    money = money0
    while money < target:
        count += 1
        if money > bet:
            money -= bet
        else:
            break
        game = (0, bet*2)
        gain = random.choice(game)
        money += gain
        print(count,':','掛け金', bet, '獲得', gain, '所持金', money)
        bet *= 2

shojikin = 10000
nerai = 20000
kakekin = 100

baipush(shojikin, kakekin, nerai)
実行結果

負けてしまいました。7回目で6400賭けましたが負けて、所持金1100となり終了です。

1 : 掛け金 100 獲得 200 所持金 10100
2 : 掛け金 200 獲得 400 所持金 10300
3 : 掛け金 400 獲得 0 所持金 9900
4 : 掛け金 800 獲得 0 所持金 9100
5 : 掛け金 1600 獲得 3200 所持金 10700
6 : 掛け金 3200 獲得 0 所持金 7500
7 : 掛け金 6400 獲得 0 所持金 1100

もう一度やってみます。今度は勝ちです。所持金は28900となり最初の10000がおよそ3倍になりました。

1 : 掛け金 100 獲得 0 所持金 9900
2 : 掛け金 200 獲得 400 所持金 10100
3 : 掛け金 400 獲得 800 所持金 10500
4 : 掛け金 800 獲得 1600 所持金 11300
5 : 掛け金 1600 獲得 3200 所持金 12900
6 : 掛け金 3200 獲得 0 所持金 9700
7 : 掛け金 6400 獲得 12800 所持金 16100
8 : 掛け金 12800 獲得 25600 所持金 28900


この結果だけではどの程度勝てそうなのかわからないので試行回数を増やします。100回賭けた場合の勝率、合計所持金、平均所持金を出します。勝率は目標額を越えた回数/試行回数(100)とします。また、100回の所持金をグラフにします。

コード

始めの持ち金を10000、最初の賭け金を100、目標金額を20000として計算します。勝ち負けはリストgameに 0、掛金×2 の2つの値を持たせてrandom.choiceでランダムにどちらかを選択しています。

%matplotlib inline

import random
import matplotlib.pyplot as plt

def baipush(money0, bet1, target):
    bet = bet1
    money = money0
    while money < target:
        if money > bet:
            money -= bet
        else:
            break
        game = [0, bet*2]
        gain = random.choice(game)
        money += gain
        bet *= 2
    return money

result_list = []
shojikin = 10000
nerai = 20000
kakekin = 100
kaisu = 100

for i in range(kaisu):
    result = baipush(shojikin, kakekin, nerai)
    result_list.append(result)
    
plt.hist(result_list, bins=100)
plt.show()    

win = [k for k in result_list if k > nerai]
print('勝率',len(win)/kaisu, '合計所持金',sum(result_list), '平均所持金',sum(result_list)/kaisu)
実行結果

勝率は0.26と低いですが、平均所持金は10000を少し越えました。分布をみると3万前後の大勝がありそれが効いているように見えます。

勝率 0.26 合計所持金 1033400 平均所持金 10334.0
f:id:T_A_T:20200715200032p:plain

この結果ではわずかながら倍プッシュは儲かると言えますが、100回の試行を何回も繰り返すと平均所持金が10000を切る場合も多く何とも言えない結果です。
100回の試行を繰り返した場合の平均所持金

10334.0
10486.0
9480.0
12438.0
11514.0
9460.0
12032.0
10124.0
9050.0
8204.0

以下のサイトを参考にさせていただきました

Pythonの文法メモ >> 【標準ライブラリ】randomによる乱数生成

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村