初めに
モンテカルロ法
というギャンブルの戦略があることを知り、実際にこれで勝負した場合の勝率がどの程度になるのかプログラムを書いて調べてみた。
参考動画: https://www.youtube.com/watch?v=_suZM2y9wyA
モンテカルロ法とは
勝率1/2の勝負に、以下のルールでベットを行い続ける方法
まず [1, 2, 3]
の配列を作成する
-- loop --
- 配列の要素数が2未満だったらループを抜ける
- 配列の先頭と末尾の要素を足した額をベットする (初期状態では
4
) - 勝ったら → 配列の先頭と末尾の要素を削除し 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%くらいの確率で破産する。怖い。
終わりに
実世界の場合一度破産したら死んでしまうので恐ろしくてなかなか出来ない。やはり必勝法などは無かった。