ココモ法の検証シミュレーション(c++/c言語)

  • このエントリーをはてなブックマークに追加

スポンサーリンク

※サイト運営にサーバーは必須です※
ヘテムル は大型サイトの作成に向いています~

はじめに

※目次用の記事:ギャンブルの賭け方の種類をまとめてみた

賭け方にはいくつか種類がある。

そのうちの一つに、ココモ法というのがある。

この記事では、ココモ法とはなにかを説明した後、プログラムによるシミュレーション結果を示す。

ココモ法とは

最小の賭け金額(例えば、1)を自分で設定する。

負けた場合
(直前に1回だけ負けている):賭け金は、1
(直前に2回以上負けている):1つ前の勝負で賭けていたお金の分だけ、賭け金に加える

(今回の賭け金)=(前回の賭け金)+(前々回の賭け金)に従う
(直前に1回だけ負けている)場合は(前々回の賭け金)=0と考えている

勝った場合:次の勝負の賭け金を、1(最小の賭け金額)に戻す

ココモ法は、戻り金が3倍のゲームを想定している

ココモ法の具体例

ルールだけ、説明してもイメージがつかめないと思うので、具体例を挙げる。

勝率が1/3で払戻金が3倍の勝負をイメージしてください。

9連敗した後、10回目で勝利した場合を考える。

勝負回数 賭け金 累計賭け金 利益
1 1 1 2
2 1 2 1
3 2 4 2
4 3 7 2
5 5 12 3
6 8 20 4
7 13 33 6
8 21 54 9
9 34 88 14
10 55 143 22

 

連敗したら、以下のテーブルのように賭け金を
1→1→2→3→5→8→13→21→34→55と増やしていく

10回目の累計賭け金額は148となるが、10回目で勝利すれば、55×3-148=+22だけ利益が得られる。

※この数字を見た時、高校で習ったフィボナッチ数列がフラッシュバックするのは私だけだろうか……

もしも、払戻金が2倍だったら……

ココモ法は払い戻し3倍の時に使用されることを想定されているが、2倍の場合どのようになるか考えてみる

勝負回数 賭け金 累計賭け金 利益
1 1 1 1
2 1 2 0
3 2 4 0
4 3 7 -1
5 5 12 -2
6 8 20 -4
7 13 33 -7
8 21 54 -12
9 34 88 -20
10 55 143 -33

1連敗と2連敗の時の利益が0でそれ以上連敗すると、最終的な獲得金額はマイナスになる。

3連敗以上することがほんどないといえるのなら有効な手法なのかもしれない……(実際にプログラムを走らせると当然ながら、3連敗以上することはザラにある)

ココモ法の特徴

  • 主に払い戻し3倍の時に使用
  • 連敗しても、最後に勝てば、今まで負けていた分のお金を取り戻せる上に、利益を上乗せすることができる。そういう意味で、マーチンゲール法(主に払い戻し2倍の時に使用)みたいなところがある。
  • 前々回の勝負に使用した賭け金額を覚えておかないといけない分、少し面倒くさい……実際に使うという観点でも、プログラム的な観点でも。(マーチンゲール法やパーレー法と比べて、宣言しないといけない変数は増える)

ココモ法の検証

以下では2種類のプログラムを紹介する。

言語はC++で作ったが、C言語としてコンパイルしても動くと思う

※このプログラムを組んだ人間は、大学時代に少しプログラムをかじった程度の戦闘能力しかない

ココモ法個別シミュレーション

 

プログラムで使用している変数の説明

マーチンゲール法(2倍賭け)の破綻までのシミュレーションで紹介したプログラムと同じ変数の置き方をしている

i_max:勝負の回数
w:賭けたお金の戻る倍率を指定。ここでは3倍を指定
p:勝率を指定。ここでは1/3の確率なので33.333を指定。

※pの値は、個別シミュレーションでは、33.333、期待値シミュレーションでは33.3333を使用。3の数が違うのに特に意味はない

m_min:かけ金を指定
m_ini:最初の資金を指定

※ここではm_min=1でm_ini=1000と、最小の賭け金の1000倍を所持していると考えている。

例えば、最小の賭け金が1000円(千円)だとするなら、手元の軍資金は、1000000円(百万円)。割と現実的な設定だと思われる。

r:乱数(0~100の乱数)

※乱数rが勝率pより下の数で収まるなら勝ちの判定がでる。

そして、勝負を続けていくうちに、負け続けることもあるだろう。
そしてついに、賭けしようにも手持ちのお金が足りなくなるかもしれない。
この場合、これ以上勝負ができなくなり、プログラムは終了する。(破綻判定)

つまり、借金はNG

c:トータルの勝ち負けの差がどのくらいあるか調べる用 。

※ココモ法で、新たに宣言した変数

m_bet1:一つ前の勝負の賭け金額を記憶する(最初は0)
m_bet_tem:今回の賭け金額を一時的(temporary)に記憶させる用

実際にプログラムを走らせると以下のような結果となる
勝負回数i_maxは100000(10万回)までとする

#倍率は3.000000 勝率は33.333000 最小の賭け金は1.000000 手持ちのお金は1000.000000
1回目 賭け金は1.000000 lose 勝敗差-1 手持ちのお金は999.000000
2回目 賭け金は1.000000 lose 勝敗差-2 手持ちのお金は998.000000
3回目 賭け金は2.000000 lose 勝敗差-3 手持ちのお金は996.000000
(省略)
1771回目 賭け金は377.000000 lose 勝敗差-611 手持ちのお金は2056.000000
1772回目 賭け金は610.000000 lose 勝敗差-612 手持ちのお金は1446.000000
1773回目 賭け金は987.000000 lose 勝敗差-613 手持ちのお金は459.000000
1773回目で手持ちのお金が足りません

1774回目に必要な賭け金額は610+987=1597
1773回目終了時に持っていたお金である459を超えてしまったため、勝負不能という判定がでた。

勝負差が-613と大きな負の値を持のは、この勝負は勝率33.333%だと考えているため。

勝負を続ければ、全体の1/3が勝利で、全体の2/3が敗北する。
まとめると全体の勝負回数の-1/3の勝敗差になっていることが期待される

勝敗差は、-613となっているのは1773/3を考えるとそこまでおかしくない

※srand((unsigned)time(NULL));の部分で時間を参照した上で乱数を発生させている。そのため、実行するタイミングで結果が変化する。

ココモ法の期待値シミュレーション

上のプログラムを何度も走らせて期待値や破綻する率をもとめたい

そのためのプログラムは以下のようになる

 

プログラムで使用している変数の説明

b_pro:破綻率
※ここでいう破綻率とは手持ちのお金が、賭けに耐えられない状況を意味する。借金してお金を用意することはできないとする。

i_exp: 破綻するまで何回勝負ができるかの期待値
m_exp: 勝負が終わった段階で持っているお金の期待値
k_max:試行回数。
※k_maxを大きくすればするほど、正確な期待値が求まる。

c_exp:勝敗差の期待値

以下では、k_max=100000、i_max=100000で指定。
試行回数10万回、勝負回数10万回。

結果は以下のようになる

勝負回数は100000
試行回数は100000
破たん回数は99903
破たん率は99.903000%
破たんするまでに行える勝負回数の期待値(i_exp)は1930.530130
破たんする直前で持っているお金の期待値(m_exp)は989.007780
破たんした時の勝負差の期待値は-643.516070

破綻率は99.903%。この破綻率と一番近いのはグランマーチンゲール(α=1)だろう。

※参考:グランマーチンゲール法の破綻率は99.874%ほどで、勝負回数の期待値(i_exp)は2049.226230

ココモ法とグランマーチンゲール法には、

  • 勝った時に今まで負けてきた分の損を取り返すことができる
  • 連敗していればしているほど、勝った時の利益が大きくなる

という共通点があるので納得がいく

※ちなみに、払い戻し2倍の場合の結果も載せておく
勝負回数はオーバーフローする可能性を考慮して、2万回

勝負回数は100000
試行回数は20000
破たん回数は16073
破たん率は80.365000%
破たんするまでに行える勝負回数の期待値(i_exp)は39382.323450
破たんする直前で持っているお金の期待値(m_exp)は999.816450
破たんした時の勝負差の期待値は1.652450

当然ながら、破綻する率の値は小さくなる

関連記事

※目次用の記事:ギャンブルの賭け方の種類をまとめてみた

Unityコースやアプリコースあり。無料体験の申込みあり。
  • このエントリーをはてなブックマークに追加

スポンサーリンク

コメント

コメントを残す

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)