逆ダランベール法の検証(c++/c言語)

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

スポンサーリンク

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

はじめに

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

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

そのうちの一つである逆ダランベール法というのがある。

※ダランベール法に関してはダランベール法(ピラミッド法)の検証(c++/c言語)で紹介した

この記事では、逆ダランベール法とはなにかを説明して、プログラムによるシミュレーション結果を示す。

逆ダランベール法とは

最初の賭け金額を自分で設定する。

負けた場合:次の勝負の賭け金を、1減らす
勝った場合:次の勝負の賭け金を、1増やす

※ちなみにダランベール法は、逆ダランベール法での、負けた場合と勝った場合の操作を反対にする

<逆ダランベール法の特徴>

  • 勝った時は、多く賭けて、負けている時は少なく賭ける、手法といえる。
  • 賭けるお金の変動が±1なので、賭け金の変動が少ない。
  • 勝率が50%の勝負に対して適用するのが一般的

※勝率が50%を切る勝負だと、負ける回数の方がおおくなるので、賭ける金額が小さくなる。一方で、勝率が50%を超える勝負だと、賭け金がどんどん膨らむ。勝率が50%に近い勝負に使われる手法といえる。

<実践上の問題>

ダランベール法(ピラミッド法)の検証(c++/c言語)でも指摘したが、シミュレーションする際、いくつかのパターンに分けられる。

勝負の下限に関する問題(賭ける金額は0になった場合)

  • 勝負をいったんやめる
  • 賭ける金額を1にして、勝負を続行する

勝負の上限に関する問題

  • 上限を設けない
    ※上限を設けた場合、上限に達して、勝負をやめるかやめないかも問題になる
  • 上限を設ける
    ※例えば、(最初にスタートする金額)の2倍を最大値とする

賭け金の従う式に関する問題

  • 勝敗差が最初にスタートする金額を超えない限り、(賭ける金額)=((最初にスタートする金額)+(これまでの勝敗差)の式に従うか、そうでないか

※勝敗差が20以上になった時、賭ける金額が増えて
(賭ける金額)=(最初にスタートする金額)+(これまでの勝敗差)+α
になる場合がある

逆ダランベール法の検証

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

この記事では、上限を設けない逆ダランベール法を主に扱う。

上限を設けた場合のプログラムは、この記事の最後の部分で、参考までに乗せておく

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

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

 

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

マーチンゲール法(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:トータルの勝ち負けの差がどのくらいあるか調べる用 。

10回勝負して6勝4負けなら+2 ←(+6−4)
10回勝負して3勝7負けなら−4 ←(+3−7)

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

※上限を設けないパターンの結果。最初の賭け金額は20でスタートする。

#倍率は2.000000 勝率は50.000000 最小の賭け金は1.000000 手持ちのお金は1000.000000
1回目 賭け金は20.000000 win 勝負差1 手持ちのお金は1020.000000
2回目 賭け金は21.000000 win 勝負差2 手持ちのお金は1041.000000
3回目 賭け金は22.000000 lose 勝負差1 手持ちのお金は1019.000000
4回目 賭け金は21.000000 lose 勝負差0 手持ちのお金は998.000000
(省略)
2222回目 賭け金は29.000000 lose 勝負差-18 手持ちのお金は68.000000
2223回目 賭け金は28.000000 lose 勝負差-19 手持ちのお金は40.000000
2224回目 賭け金は27.000000 lose 勝負差-20 手持ちのお金は13.000000
2224回目で手持ちのお金が足りません

この結果からわかるのは、上限を設けない場合だと、勝負を重ねていくと、(賭ける金額)=(最初にスタートする金額)+(これまでの勝敗差)という式から外れていく。

※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
破たん回数は97725
破たん率は97.725000%
破たんするまでに行える勝負回数の期待値(i_exp)は8803.611360
破たんする直前で持っているお金の期待値(m_exp)は1014.401530
破たんした時の勝負差の期待値は0.112640

破綻率は97.725%。逆ダランベールでなく、たんなるダランベール法の破綻率も97.722%ほど。

逆ダランベール法(上限なし)とダランベール法(上限なし)で、破綻する率はほぼ同じといえる
お金の期待値は1014となっており、初期の1000よりわずかに増えている。(ぶっちゃけ、誤差の範囲で、逆ダランベール法が儲かることの証明にはなっていない)

10万回勝負を行うと、ほとんどの場合がもとの1000を下回り、一部10万回勝負が続行できた場合は大きな資金を手にするといった結果となった。

ちなみに、賭け金額の上限を設けた場合は以下のような結果となる

※上限は、最初の賭け金額の2倍の40とした。
※プログラムは下の方のページで紹介している

勝負回数は100000
試行回数は100000
破たん回数は89540
破たん率は89.540000%
破たんするまでに行える勝負回数の期待値(i_exp)は19049.477170
破たんする直前で持っているお金の期待値(m_exp)は999.860170
破たんした時の勝負差の期待値は-0.022450

上限を設けた分、破綻する率は97.725%から89.54%に少し落ちた。

ちなみに、ダランベール法(上限あり)の破綻率は89.76%だった。逆ダランベール法の方が0.22%ほど低かったことになる。

逆ダランベール法は、負けが続いている時に、賭ける金額を減らしていくので、ダランベール法と比べて、破綻率が低く出そうな気がしないでもない。

ただ、上限なしのバージョンの結果において、ダランベール法と逆ダランベール法で大きな差がなかったことから、0.22%で有意な差があると断定することができず、単に誤差の範囲という可能性がある。

関連記事

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

参考

最後に、上限を設けたバージョンのプログラムを乗せておく。

ぶちゃけ、上のプログラムにこの記述を加えただけですが……

※賭ける金額の上限を40としている

逆ダランベール法(上限あり)の個別シミュレーション

 

逆ダランベール法(上限あり)の期待値シミュレーション

 

 

無料体験レッスンあり。マンツーマン形式で初心者向け。
  • このエントリーをはてなブックマークに追加

スポンサーリンク

コメント

コメントを残す

*

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