LoginSignup
1
1

More than 3 years have passed since last update.

モンテカルロ法でルーレットに賭け続けた場合に本当に勝てるのか調べた話

Last updated at Posted at 2020-01-03

初めに

モンテカルロ法 というギャンブルの戦略があることを知り、実際にこれで勝負した場合の勝率がどの程度になるのかプログラムを書いて調べてみた。

参考動画: https://www.youtube.com/watch?v=_suZM2y9wyA

モンテカルロ法とは

勝率1/2の勝負に、以下のルールでベットを行い続ける方法

まず [1, 2, 3] の配列を作成する

-- loop --

  1. 配列の要素数が2未満だったらループを抜ける
  2. 配列の先頭と末尾の要素を足した額をベットする (初期状態では 4 )
  3. 勝ったら → 配列の先頭と末尾の要素を削除し 1. に戻る。
    負けたら → 配列の末尾に2.でベットした額と同じ値を追加し 1. に戻る

-- loop end --

書いたコード

  • ルーレットで赤or黒に賭けるのと同様の場合を想定。
  • 0だと赤でも黒でも外れ。
  • 予算は100000単位
  • プログラムでは10000ループのモンテカルロ法を行う
import Foundation

let roulette = (0...36) // 疑似ルーレット

func spin() -> Bool {
    return roulette.randomElement()! >= 19 // 0から18の数字が出たら負け
}

let n = 100
var budget = 100_000

let initialState = [1, 2, 3]

(1...100).forEach { _ in
    assert(budget > 0, "破産")
    (1...n).forEach { _ in
        var state = initialState
        while state.count >= 2 {
            if state.last! > 1000 {
                print(state)
            }
            let toBet = state.first! + state.last!

            if spin() {
                state.removeFirst()
                state.removeLast()
                budget += toBet
            } else {
                budget -= toBet
                state.append(toBet)
            }
        }
    }

    print("#################")
    print(budget)
}

所感

  • 10000ループだと80%くらいの確率で勝つ気がする。
  • 勝った時の儲けはだいたい10000単位くらい。
  • 負けるときは大負けして最終的なbudgetが10000とかになる → このときのstateを覗いてみると、 state.last! が10000以上とかになっている。怖い。
  • コードを変えて100000ループ回すと、30%くらいの確率で破産する。怖い。

終わりに

実世界の場合一度破産したら死んでしまうので恐ろしくてなかなか出来ない。やはり必勝法などは無かった。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1