rm /blog

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

オープンVIPスレ解析 ルーレット確率について

オープンVIPにこんなスレ↓がたっていた

赤と黒が二分の一の確率で出るルーレットがある
これを100回プレーをした時、100回のうちどこかで同じ色が5回連続で出る確率は?

計算式も示してね

引用元: これ解ける?

これの理論解はともかく(考えたけど面倒になったのでやめたww)、
このての問題は統計的に見ると理論値に近づく特性(大数の法則というらしい)があるので
簡単なプログラムを作って実験を試みる。

 スレ本文にもあるように、
 ・「100回投げる」を「1試行」とする
 ・1試行の中で、5回連続同じ目が出たら「成功」とする
を前提として、
この「試行」を100とか1000とか10000とか大量に行って
その中で「成功」がどれだけ出たかをカウントし、
全試行回数の中の割合から確率を統計的に算出する。
10や100程度の試行回数じゃ大した傾向はわからないが、
10000や100000やると大体の傾向が見えてくるのだ。

実験用プログラムでは外部から下記の3つの値を取得する。
(1)試行数(引数で取得)
(2)1試行内でのルーレット実施回数(propertiesから取得)
(3)何回連続で同じ目が出たら「成功」とみなすかの回数(propertiesから取得)
全部引数とかpropertiesに寄せてもよかったのだが
(2)と(3)は一通り作った後興味本位で追加したものなので
こういう変なつくりになっている。

プログラムは以下のつくりになっている。

1.引数チェック
  (1)の値を取得し、内容をチェックする。
  数値じゃなかったり、数値でも負数だったりする場合はここでException。
1.5.設定ファイル読込
  (2)と(3)を取得し、内容をチェックする。
  数値じゃなかったり、数値でも負数だったりする場合は
  デフォルト設定値の(2)=100 (3)=5を使用する。
2.実験メイン処理
  ルーレットを(2)の回数実施しその中で(3)の回数同じ目が連続で出たら「成功1回」とし
  この動きを(1)の数分ループして繰り返す。
  ちなみに結果は全てArrayListにためこむので、結構メモリを食うつくりだ。
  初期パラメータ(Xmx64M)だと(1)=10万に耐えられなかった。
  結果をテキストファイルに出力する目的のためこのようにしているが、
  単なる集計だけを目的とするならもう少しスマートなつくりにできるような気はする。
3.結果出力
  2.の結果をテキストファイルに出力する(TSVファイル)。
  出力されるファイルは2つ。
  ・Result_Bundle.txt
  ⇒試行時に対する成功回数が出力される。
   ファイルの特性上、ヘッダを除くとファイルの行数は(1)になる。
  ・Result_Detail.txt   ⇒1試行における成功の情報が詳細に出力される。
   連続成功となった目と、及び「連続」の目の判定記録である。
   RED,1,2,3,4,5なら”赤の目が1回目~5回目で連続した”ことを意味する。
   [NO SUCCESS]だとその試行では”成功が1回もなかった”ことを意味する。
4.集計
  試行の結果を集計し、
  「成功回数」「対応する成功回数が全試行内で何回発生したか」「その構成比」を標準出力する。
  
  この「構成比」の部分が、試行回数を増やしたとき、
  この問題の理論値に限りなく近づく。
  たとえば以下は試行回数10000の結果の一部の抜粋であるが
  0 319 3.19%⇒”1回も成功していないのが全試行10000回中319回あった”
  3 2439 24.39%⇒”3回成功したのが全試行10000回中2439回あった”
  となる。

正直、大したことはしていない。
↑に書いてあることを忠実に実施しているだけである。

ちなみに試行回数を10万にしたときの結果は以下の通りとなる。

100_5_loop100000.png


プログラムが間違えてなければ、成功0回(=失敗)を除くことで成功確率を求めることが出来る。
よって、大体約97%程度の確率で「成功」することになる。
要するに100回ルーレットやればその中のどこかで「5回連続で同じ目が出る」確率はかなり高い、
ということになる。
まあ、なんとなく、感覚的にもわかるような気がする。
100回もやればそりゃ1回や2回は5連続同じ目が出る事はあるんじゃねえの、
というかんじか。
こんなに高い気はしないがこんなもんなのかな。
そういえば単純に「5連続同じ目が出る」というだけでも1/(2^5)=1/32≒3.13%であり、
確か1/256(約0.39%)と言われているDQ5はぐれメタルを仲間にする確率よりははるかに高い。


(2)と(3)の値を変えてみると別の結果も考察できる。
たとえば(2)=6、(3)=5としたとき。
これは「6回ルーレットやって5回連続同じ目が出る確率」の実験になる。
(2)の値が100から6に減少したことでかなり厳しくなったといえるだろう。
(チャンスが100回から6回に縮まってしまった)
これも試行数(1)を10万回にすると、結果は以下の通りになる。

6_5_loop100000.png

この結果によると90%ちょいの確率で「失敗」する(成功は10%に満たない)ので、
直感的にもわかりやすい数字になっている気がする。
ちなみにこのケースだと理論値はわかりやすくて、
成功のパターンは以下の6つしかない。
赤黒黒黒黒黒
黒赤赤赤赤赤
赤赤赤赤赤黒
黒黒黒黒黒赤
赤赤赤赤赤赤
黒黒黒黒黒黒

これに対して全事象数は2^6なので、計算すると6/2^6≒9.38%となる。
大体↑の実験結果と近いので、まあプログラムは問題なさそうである。


別の切り口での実験もできる。
たとえば(2)=100、(3)=2としたとき。
これは「100回ルーレットやって2回連続同じ目が出る確率」の実験になる。
成功の判定基準が5回⇒2回に緩くなったことで、
大分成功確率があがることが容易に想像できる。
5回のときですら約97%という実験結果が出ているのだから2回だとすげーことになりそうである。
実際実験してみると、成功しすぎたのかXmx256Mでは(1)10万回での試行は無理(OutOfMemory)だった。
(1)試行数=10000回でやってみたときが↓。

100_2_loop10000_tail.png

注目すべきは失敗していないというところか。
最小の成功数でも33=最低でも33回は成功していて、失敗していない。
”失敗するほうがレア”ということになる。
というか良く考えたら「2回連続同色で成功」ということは
裏を返せば赤-黒-赤-黒-…と毎回違う色が出続けない限り成功になる。
このパターンは赤から始まるパターンと黒から始まるパターンで2パターンしかなく、
一方目の出方の全パターン数は100回のルーレットで2^100だから、
2/(2^100)=1/(2^99)≒0.000000000000000000000000000001577721…≒0.0000000000000000000000000001577%だ。
逆に言えば1-0.000000000000000000000000000001577721…≒0.9999999999…(ry≒99.9999999…(ry%で成功する。
そりゃ失敗するほうが難しいか。

実験結果から考察するに(直感的にもわかることだが)、
(2)ルーレット回数が大きいほど成功確率は高まり
(3)連続同色判定数が大きいほど成功確率は低まり
(2)と(3)が近ければ近いほど成功確率は低まる。
成功確率を高めるためには(2)を大きくして(3)を小さくすればよいわけだ。
多分、この問題の一般解は、(2)=n、(3)=mとすると

α(n-m+γ)/βm

みたいな形になっていると予想できる。(実際のところ同課は知らないが)


そのうち暇なときに理論解を追ってみるとして、
「100回中5回」の当初の実験結果に戻ると、
どうも「成功3回」というのが最も確率として出やすいようである。
これは「成功3回」にあたる事象数がパターン数では最も多いことを指すが、
2回や1回ではなく「3回」なのはなぜなのだろう。気になる。
感覚的にも2回成功の方がパターン数は多い気がするのだが。
ためしに(2)を20や30にかえてみても、
1回成功が最も多く次いで2回成功・3回成功と続く。
(2)が85くらいのときはまだ2回成功>3回成功で、
(2)が90くらいのときに2回成功≒3回成功、とトントンくらいになる。
恐らくこのあたりから2回成功と3回成功のパターン数の逆転が始まる。
理論値にはこの辺の考慮が反映されているのだろう。

ところで、当方TOEICのスコアが絶望的に悪い故、
プログラム内で使われている英語のスペルミスや文法的な問題点等が多々ある可能性がある。
温かい目で見守っていただければと思います。