10%投資法は、絶対に儲からない証明 (c++/c言語)

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

スポンサーリンク

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

目次

はじめに

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

賭け方の一つに10%投資法という手法が存在する。

賭け方はいたって簡単で手持ちのお金の10%を賭ければよい。

勝っている場合は、賭ける金額が増え、負け越している場合は、賭ける金額が減少する。

たとえ、負け続けていた場合でも、お金の減少が緩やかで、連敗が続いても耐えられる賭け方だと紹介されることが多い。

しかし、本当だろうか?

この記事では、c++/c言語でのシミュレーション結果を紹介する。
また、なぜ10%は儲からないか説明する。

10%投資法とは

自分の手持ちのお金の10%を賭ける

例えば、

手持ちのお金:100円→賭ける金:10円
手持ちのお金:320円→賭ける金:32円

最後の桁を、「切り捨て」にするか、「切り上げ」にするか、「四捨五入」にするかはお好みで変更。

※以下のプログラムのシミュレーションは、「切り捨て」を採用している。
プログラミングをしたことがある人は何となくわかると思うが、「切り上げ」や「四捨五入」は、「切り捨て」と比べるとひと手間加えないといけないため。

単純な問題

10%投資法の説明に入る前に、ここで一つ問題。

Question:

原価1000円の商品を売っていました。
利益を出すために、1割高い値段を売値にしました。
ところが、お客が来なかったので売値より1割安い値段で売りました。

さて、商品の値段は何円でしょうか?(小学生レベルの問題)

Answer:

答えは1000円ではない。

正しい答えは990円だ

理由:1000×1.1×0.9=990円

10%投資法の具体例

手持ちの金を100でスタートして、2回勝負した時の表は以下のようになる

勝負 1回目 2回目 利益
○○ 110 121 21
○× 110 99 -1
×○ 90 99 -1
×× 90 81 -19
    期待値 0

 

負け続けた時の損は-19に対して、勝ちつづけた時の利益は+21と大きい。

表からわかるように勝ち負けの数が同じ時は99となり、-1だけ損する。

これは何を意味するか?

  • 勝ち続けた時の利益がでかい
  • 負け続けた時の損失は緩やか
  • 勝ちと負けの数が同じぐらいだと結局、損する

つまり、負け続けた時の損失が緩和されている分、勝ちと負けの数が同じぐらいのところで皺寄せされている、と解釈することができる

※参考までに4回まで勝負した時のテーブルを乗せておく

勝負 1 2 3 4
○○○○ 11000 12100 13310 14641
○○○× 11000 12100 13310 11979
○○×○ 11000 12100 10890 11979
○○×× 11000 12100 10890 9801
○×○○ 11000 9900 10890 11979
○×○× 11000 9900 10890 9801
○××○ 11000 9900 8910 9801
○××× 11000 9900 8910 8019
×○○○ 9000 9900 10890 11979
×○○× 9000 9900 10890 9801
×○×○ 9000 9900 8910 9801
×○×× 9000 9900 8910 8019
××○○ 9000 8100 8910 9801
××○× 9000 8100 8910 8019
×××○ 9000 8100 7290 8019
×××× 9000 8100 7290 6561
期待値 10000 10000 10000 10000

 

10%投資法の検証

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

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

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

10%投資法個別シミュレーション

 

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

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

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

※初期(initial)のスぺルを自分が勘違いしていたことに後から気が付いた。だが、プログラムと記事を今からすべて手直しするのはしんどいので、時間があったら、宣言する変数の名前をm=intからm_iniに書き替えたい。……文章を書いている人間の英語力の低さがばれて、地味に恥ずかしい。

※ここではm_min=1でm_int=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万回)までとする

#倍率は2.000000 勝率は50.000000 最小の賭け金は1.000000 手持ちのお金は1000.000000
1回目 賭け金は100.000000 lose 勝負差-1 手持ちのお金は900.000000
2回目 賭け金は90.000000 win 勝負差0 手持ちのお金は990.000000
3回目 賭け金は99.000000 lose 勝負差-1 手持ちのお金は891.000000
(省略)
810回目 賭け金は1.000000 lose 勝負差-8 手持ちのお金は10.000000
811回目 賭け金は1.000000 lose 勝負差-9 手持ちのお金は9.000000
811回目賭け金が0になります

 

手持ちのお金を1/10にして切り捨てているため、手持ちのお金が10を下回ると、切り捨てた時のお金が0になり、賭けの続行ができないと判定がでるようになっている。

※もしも、手持ちのお金がゼロになるまで賭けを続けるプログラムにしたいのなら、m_bet=max(m_int/10,m_min)みたいに宣言して、手持ちお金の1/10(m_int/10)が0になった時、最小の賭け金額(m_min:1)が採用されるようにする

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

10%投資法の期待値シミュレーション

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

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

 

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

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

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

※マーチンゲール法になかった要素

c_exp:勝敗差の期待値

以下では、k_max=100000、i_max=100000で指定。
試行回数10万回、勝負回数10万回。
手持ちのお金は1000でスタート

#倍率は2.000000 勝率は50.000000 最小の賭け金は1.000000 手持ちのお金は1000.000000
1番目343回目で破たん 手持ちのお金は9.000000
(省略)
100000番目733回目で破たん 手持ちのお金は9.000000
勝負回数は100000
試行回数は100000
破たん回数は100000
破たん率は100.000000%
破たんするまでに行える勝負回数の期待値(i_exp)は1070.484100
破たんする直前で持っているお金の期待値(m_exp)は9.000000
破たんした時の勝負差の期待値は0.041100

10万回勝負したら、必ず100%で破綻していることがわかる。

破たんする直前で持っているお金の期待値が9なのは、上のプログラムでも説明したが、持ち金が10を下回ると、10%して切る捨てた時のかけ金が0になり、勝負ができないと判定されるから

破たんするまでに行える勝負回数の期待値は1070回。

破たんした時の勝負差の期待値は0.04でほぼ0で、勝ちと負けの回数がほぼ同じ。

これが意味するのは「負け越して、破綻したというわけではない」ということ。

期待値という観点で、ざっくり考えると、破綻した時におよそ1070回で、勝ちが535回で負けが535回程度している

※正確には、上の文章は正しくない。平均1070回の勝負をしているが、1070回よりも早い段階で負けた場合は、ある程度負け越してゲームが終了する事象が多いだろう。一方で、1070回よりも長く勝負できている場合は、勝負回数的には勝ち越していている事象が多いと考えられる。平均して1070回目で破たんしており、平均して勝負差が0だからといって、1070回付近で破たんする事象において、勝敗の差が均等という保証はない。

ちなみに、破たん率は100%で、勝負回数の期待値が1070回というのは、個人的にかなり破綻するまでのスピードはかなり速いと思う。

破綻(パンク)するまでのスピードが速いとされているマーチンゲール法ですら、破綻率は99%後半で100%には届かなかった。勝負回数の期待値も3000回は超えていた。

結果考察

勝負をして勝ち負けが同じ程度だと、×0.99されていき、最終的にお金をすり減らす。

最初1000あったお金も、最後には10を下回り、勝負ができなくなる。

ここで、0.99を何乗すると0.01(10/1000)になるか考えてみる

乗数
1 0.99
2 0.9801
10 0.904382
50 0.605006
100 0.366032
200 0.13398
300 0.049041
400 0.017951
458 0.010021
459 0.009921
500 0.00657
535 0.004622

 

0.99を458.2乗すると0.01になる

※458.2という値は、エクセルなどでで0.99を底にして値(ここでは0.01)を入れると見積もれる(=LOG(0.01,0.99))

※今回の場合、正確には、0.01(10/1000)でなく0.009(9/1000)になるポイントを考えるべき

※0.99の535(1070/2)乗の値が0.00462で2倍にすると約0.009。2倍のファクターがどこからやってくるかいまいちよくわからない……

まとめ

以上のことからもわかる通り、10%投資法は、必勝法ならぬ、必負法といえる。

では、どうすれば、よいか?

私は、最初の方で、「負け続けた時の損失が緩和されている分、勝ちと負けの数が同じぐらいのところで皺寄せされている」と述べた。

原因は勝敗の回数が同じ程度でも損してしまうことだ。

そのため、なにかしらの形で、勝ちと負けの数が同じぐらいのところで損ではなく利益がでるような賭け方を考えれば、必勝法になりうるのかもしれない……

書籍の紹介

ギャンブルの必勝法が本当に儲かるかプログラミングで検証してみた』は以下の疑問にお答えします。

●勝率が50%の場合、利益を生み出す必勝法は存在するか?
●勝率が60%の場合、どのように賭けるのが最適か?

必勝法と思われている手法を15種類紹介します。必勝法には、例えば、マーチンゲール法(負けた時に2倍賭ける手法)などがあります。これらの手法が本当に儲かるかプログラミングを使用して検証します。また、検証するために必要なプログラミングの知識(C#)も紹介しています。

ギャンブルの必勝法が本当に儲かるかプログラミングで検証してみた

関連記事

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

 

~Webサイトを自分で作ってみませんか?~

Webサイトを運営するにはサーバーが必須です。
このサイトは、エックスサーバー のサーバーを使用しています。
エックスサーバーは無料で10日間お試しができます。

     

コメント

コメントを残す

*

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