マルチンゲール戦略を試してみる

30分プログラム、その553。資金管理(ピラミッド法) - komamitsu.logがおもしろかったので、ボクも試してみた。
ボクが試した戦略は、マルチンゲール戦略というやつで

  • 1万円掛ける
  • 勝ったら、やめる
  • 負けたら、掛金を倍にして、再チェレン

というもので、(資金が無限にあれば)必ず1万円儲かるという戦略。たしか、中学生のころに算数でホラー (パラドックス事件簿)で読んだ気がする。

必ず儲かる戦略なので、儲けるのに必要な金額を計算してみた。

使い方

*Main> play
3
*Main> play
1
*Main> play
1
*Main> play
1

あれ、意外と少ない資金で儲かるなぁ。たぶん、勝率が5割なのが原因だろう。

ソースコード

import System.Random
import Control.Monad.State

type Money = Int

gamble :: RandomGen g => State g Bool
gamble = do g <- get
            (x,g') <- return $ random g
            put g'
            return x

martingale :: RandomGen g => Money -> Money -> State g Money
martingale bet used =
    do let used' = used + bet
       win <- gamble
       if win then return used'
              else martingale (2*bet) used'

play = do g <- newStdGen
          return $ fst $ runState (martingale 1 0) g