【移植#96】2つのグリコ戦略を1万回比べる — 乱数と期待値を分けて読む¶

この記事の3行まとめ
- 1:1:1と2:2:1の手の出し方を、500回勝負×1万試合で比較します
- 3・6・6歩のルールでは、1ラウンドの得点差の期待値は理論上ちょうど0です
- 固定seedで結果を再現できますが、1回の試行結果から戦略の優劣は断定できません
乱数で何度も試す前に、何を数えるかを決める¶
2010年5月13日の原典は、グー・チョキ・パーを1:1:1で出す人と2:2:1で出す人を用意し、500回対戦した結果を1万回集計するモンテカルロ例です。原典では一例として先手4,914勝、後手4,950勝を紹介しています。
原典「じゃんけん『グリコ』とモンテカルロ・シミュレーション」を読む
原典が示すコード配布リンクから、現在はサンプル本体を取得できませんでした。そこで本文にある試行回数と手の比率を基に、結果を追跡できるMQL5スクリプトを独立に作り直しました。ゲームの採点は、グーで勝てば3歩、チョキとパーで勝てば6歩ずつ進むルールとし、1試合500回の合計歩数で勝敗を決めます。地域や遊び方によるルール差があるため、ここではこの採点を明示した検証です。
1ラウンドの期待得点差は0¶
手をグー=0、チョキ=1、パー=2と番号付けし、1:1:1側から見た得点差を考えます。2:2:1側の手は、グー⅖、チョキ⅖、パー⅕の確率で選ばれます。引き分けは0歩、勝者は上記の歩数を得点し、敗者から同じ歩数を引きます。
| 得点差 | -6歩 | -3歩 | 0歩 | +3歩 | +6歩 |
|---|---|---|---|---|---|
| 起きる確率 | ⅕ | 2/15 | ⅓ | 2/15 | ⅕ |
期待値は次のとおりです。
(-6 × 1/5) + (-3 × 2/15) + (0 × 1/3) + (3 × 2/15) + (6 × 1/5) = 0
分散は16.8歩²です。500回の1試合では得点差の期待値は0、分散は8,400歩²になります。得点差の分布自体も左右対称なので、同じルール・独立な抽選で試合を重ねれば、どちらかの勝ち数が恒常的に増えるとは期待されません。ただし、有限回のシミュレーションでは勝ち数や平均得点差が0からずれるのが普通です。
これは「2:2:1が相手を必ず上回る」という意味ではありません。相手の出し方やグリコのゴールまでの距離、歩数ルールが変われば、最適な手の割合や勝つ確率も変わります。ここでの結論は、指定した1:1:1対2:2:1の抽選と得点方式に限られます。
MQL5では剰余の偏りを避けて手を抽選¶
配布スクリプトは、1:1:1側を3区分、2:2:1側を5区分に分けて手を選びます。MathRand()は0から32,767までの整数を返します。範囲の個数32,768は3や5で割り切れないため、単純なMathRand()%3や%5では区分ごとの回数が均等になりません。そこで、割り切れる末尾の範囲を作り、範囲外の値を引き直してから剰余を取ります。
乱数の初期値には入力seedを使います。MQL5公式リファレンスにあるとおり、同じseedでMathSrand()を呼ぶと同じ疑似乱数列を再現できます。これはデバッグや条件比較に便利ですが、暗号用途の乱数ではありません。seedを変えると試行列も変わるため、単一seedの結果だけで判断せず、必要に応じて複数seedで確認してください。MathRand()公式リファレンス・MathSrand()公式リファレンス
固定seedでの実行結果¶
専用MT5でseed=20260929、500回×1万試合を実行した結果は次のとおりです。
- 1:1:1側: 4,987勝
- 2:2:1側: 4,878勝
- 引き分け: 135試合
- 1試合あたり平均得点差(1:1:1側): +0.396歩
- 得点差の二乗平均: 8,387.2656歩²
勝ち数の差は109試合ですが、1試合ごとの得点差が持つ標準偏差は約91.65歩です。試合単位の得点差を1万回平均したときの標準誤差は約0.92歩なので、観測された平均+0.396歩は理論値0から大きく離れた値ではありません。二乗平均も理論分散8,400歩²に近い結果です。
別実装で同じMathRand()の線形合同式と棄却抽選を再現し、勝敗数・引き分け・得点差の合計・二乗和がすべて一致することを確認しました。専用MT5でも同一seedの再実行は完全一致し、seedを1増やすと集計が変わることを確認しています。
使い方と注意点¶
スクリプトをチャートへ実行すると、試合数、1試合の勝負回数、seedを入力できます。初期値は原典と同じ500回×1万試合です。seedを固定しておけば、手直しの前後で同じ乱数列を使って比較できます。
これは確率モデルを理解するためのサンプルで、売買シグナルや取引優位性を測るものではありません。MQL5の標準疑似乱数列にも依存し、より大きな試行回数や厳密な乱数品質評価が必要な用途には別途検討が必要です。乱数生成器そのものの統計的な比較は【検証#18】MathRandの乱数は偏っている?XorShiftとの比較、ランダム方向を戦略の基準線として固定する話は【移植#77】5日ごとのランダム方向を検証するを参照してください。
ダウンロード¶
96_Glico_Monte_Carlo_v1_00.mq5 をダウンロード
前後の記事¶
次: 【移植#97】5秒・15秒・30秒足をティックから描く — MT5で刻むサブ分足