じゃんけん「グリコ」とモンテカルロ・シミュレーション

今回の記事はPhaiさんのブログを読んで思い付いた内容です。


参考: http://fxfxtrade.blog81.fc2.com/blog-entry-71.html


じゃんけん「グリコ」が何なのか?は、リンク先を読んでいただくとして、私が驚いたのは、そんな遊びにも最適な戦略が存在していたということです。

> ちなみにこのグリコでの最終的な最適戦略は
> グー、チョキ、パーの比率を2:2:1で出す
> というルールに落ち着きます。


小学生の頃に遊んだ時に、後方に取り残されてた(=負け気味だった)記憶があるのですが、
もしかして、嵌められていた?( ̄Д ̄;) ガーン
なんて思っちゃいました。


そして、「グー、チョキ、パーの比率を2:2:1で出す人」と、「グー、チョキ、パーの比率を1:1:1で出す人」が対決したら実際どうなるの?という点が気になりました。


この問題に対しては、確率や期待値や場合分けの組み合わせで理論的に説明することは簡単にできますが、仮に、説明困難だった場合にどうするかというと…、コンピュータ上で無理やり対決させることができます。
「グー、チョキ、パーの比率を2:2:1で出す人」と、「グー、チョキ、パーの比率を1:1:1で出す人」をプログラムで用意して、乱数でランダムに手を決めて何回も勝負させれば、二人のどちらが有利なのか分かるはずです。
このような乱数を使って何度も試行してみて傾向を調べる方法をモンテカルロ・シミュレーション(モンテカルロ法)と呼びます。乱数を使うので厳密な正解が求められるわけではありませんが、複雑な確率の数式を解くよりも、楽に結果を予測できるので便利です。


じゃんけん「グリコ」のモンテカルロ・シミュレーション


シミュレーションプログラムの方針は、
(1)「グー、チョキ、パーの比率を1:1:1でランダムに出す人(先手)」を作成。
(2)「グー、チョキ、パーの比率を2:2:1でランダムに出す人(後手)」を作成。
(3) 両者を500回連続対決させて、その結果で勝敗を決める。
(4) (3)のシミュレーションを1万回繰り返し、両者が何勝したか調べる。
というカタチで考えます。
具体的にどのようにプログラムを書いたらよいか?は、こちらのサンプルコードを見てください。
(これは全然EA作りとは関係ないですが、プログラミングの練習になると思います^^;


scripts フォルダにコピーして実行すると、何秒か後に以下のダイアログが出ます。

これで、先手が4914勝 後手が4950勝 になったことが分かります。ランダムなシミュレーションなので、繰り返す毎に勝利数は変わりますが、概ね 5000勝となって、「2:2:1」戦略が「1:1:1」戦略に期待値として負けない戦略だと推測できます。


プログラム内のじゃんけんの手を決める部分を変えれば、「1:1:1」戦略と「1:0:0」戦略(=グーだけ)を対決させてみることもできます。シミュレーションを何百万回とやりたくなったら、他のプログラミング言語に移行した方が良いですが、ちょっとしたコトなら MQL4 でも可能なので、他の事例で試す機会があればどうぞ。