31システムのシミュレーション(c++/c言語)

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

スポンサーリンク

※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~

はじめに

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

この記事では、31システムの紹介と、そのシミュレーション結果を示す

31システムとは

次のような4つのセクションに分かれた、9の数字を用意
(1,1,1/2,2/4,4/8,8)

左側の数字から賭けていく。(最初なら一番左端の1)

負けた場合:一つ右側の数字に移る
勝った場合:次のセクションの一番左側の数字に移る

以下の場合、リセットする(一番左端の1から再スタート)

  • 2連勝した場合
  • 最後の数字の8まで到達して勝負を終えた場合

 

<概略図>

1→1→1→(2へ)
↓(勝ち)
2→2→(4へ)

4→4→(8へ)

8→8→(1から再スタート)

(1から再スタート)

31システムの具体例

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

勝敗 賭け金 累計賭け金 最終利益
× 1 1 -1
×× 1 2 -2
××× 1 3 -3
×××× 2 5 -5
××××○ 2 7 -3
××××○× 4 11 -7
××××○×○ 4 15 -3
××××○×○○ 8 23 5

31システムの特徴

  • 9回のうち、2連勝できれば、収益は最低でも+1される
  • 9回のうち、1度も連勝できなかった場合、最大で-31の損失

※2連勝できない場合で一番得なパターンは+1かな?(○×○×○×○のパターン)

※資金が31(1+1+1+2+2+4+4+8+8)必要なシステムなので31システムと呼ばれているらしい

2連勝すれば、収益がプラスになる説明

2連勝して、ゲームがリセットされる場合で、ギリギリのパターンを考えると、以下のパターンが考えられる。どのパターンも、損失を上回っていることがわかる

(損失)<(収益)
1<1+1:(1<2)
1+1<1+2:(2<3)
1+1+1<2+2:(3<4)
1+1+1+2<2+4:(5<6)
1+1+1+2+2<4+4: (7<8)
1+1+1+2+2+4<4+8: (11<12)
1+1+1+2+2+4+4<8+8: (15<16)

どこかで2連勝すれば、最低でも+1の利益が得られる

正確には、
1+(途中の単発勝利分)×2

(×2するのは、負けたのが裏返って勝ったと考えているので、「負けた分」と「勝った分」で2倍になるから。上の具体例では、賭け金額が2の時に単発の勝利をしているので1+2×2=5が最終的な収益となっている)

※上の考察から、「2連勝すれば、収益がプラスになる」システムを作りたいなら、「勝った時に、次のセクションに移る」というルールは必須でないことがわかる。

※31システムは、賭け金額は8でストップしているが、8で止めずに、16,16,32,32と増やしていくことも考えられる。数列の増え方が約2倍遅くて、2連勝して、ゲームをリセットできるマーチンゲール法と捉えることもできる。

マーチンゲールと31システムの対応

  • マーチンゲール:1/2/4/8/16
  • 31システム:1/1,1/2,2/4,4/8,8

31システムの検証

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

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

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

31システムの個別シミュレーション

 

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

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

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

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

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

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

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

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

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

つまり、借金はNG

c:トータルの勝ち負けの差がどのくらいあるか調べる用
w_str;連勝カウント用

step_a:4つのセクションの内、何番目か
step:セクション内で、左から何番目か?(1が三つあるセクションは、プログラムの都合で、0、1、2番目とカウントしている。残りは1、2番目とカウント)

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

#倍率は2.000000 勝率は50.000000 最小の賭け金は1.000000 手持ちのお金は1000.000000
1回目 賭け金は1.000000 step:1-0 win(1連勝) 勝敗差1 手持ちのお金は1001.000000
2回目 賭け金は2.000000 step:2-1 lose 勝敗差0 手持ちのお金は999.000000
3回目 賭け金は2.000000 step:2-2 win(1連勝) 勝敗差1 手持ちのお金は1001.000000
4回目 賭け金は4.000000 step:3-1 lose 勝敗差0 手持ちのお金は997.000000
5回目 賭け金は4.000000 step:3-2 lose 勝敗差-1 手持ちのお金は993.000000
6回目 賭け金は8.000000 step:4-1 lose 勝敗差-2 手持ちのお金は985.000000
7回目 賭け金は8.000000 step:4-2 win(1連勝) 勝敗差-1 手持ちのお金は993.000000
8回目 賭け金は1.000000 step:1-0 lose 勝敗差-2 手持ちのお金は992.000000
(省略)
55931回目 賭け金は4.000000 step:3-1 win(1連勝) 勝敗差-259 手持ちのお金は13.000000
55932回目 賭け金は8.000000 step:4-1 lose 勝敗差-260 手持ちのお金は5.000000
次の勝負に必要な金額は8.000000です。55932回目でゲームを終了します

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

31システムの期待値シミュレーション

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

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

 

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

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

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

c_exp:勝敗差の期待値

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

結果は以下のようになった

勝負回数は100000
試行回数は20000
破たん回数は7562
破たん率は37.810000%
破たんするまでに行える勝負回数の期待値(i_exp)は80337.882000
破たんする直前で持っているお金の期待値(m_exp)は995.947450
破たんした時の勝負差の期待値は-1.423400

関連記事

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

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

スポンサーリンク

コメントを残す

*

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