マガジン

じゃんけんはゲームとして成立しているか:選択と運

遊びを見つける

執筆にClaudeを使用しています。

迷路の一角から出口までを段階的に照らす三つの灯りと、小さな旅人の駒
記事のテーマをもとに制作したAI生成イラスト。

順番決めに使うじゃんけんを、ゲームと呼んでよいのでしょうか。「グー・チョキ・パーは対等で、どれを出しても勝つ確率は同じです。それなら考える意味がなく、コイン投げと変わらない」という意見と、「相手の癖を読んで勝つこともあるのだから、立派な読み合いです」という意見が並ぶ場面を考えてみます。どちらも間違いではなく、「相手がどんな出し方をするか」という前提によって答えが変わります。 この記事では、その前提を読者が自分で確かめる方法を示します。相手がまったくの無作為なら、選択は結果に影響しません。ところが相手が人間になると、出す手に偏りや癖が入り込み、選択に意味が生まれる可能性があります。本当に生まれるかどうかは、記録をとって数えれば判断できます。結果の数値はここでは書きません。集計の単位と読み方を用意するので、手元のデータで答えを出してください。

この記事の目次
  1. 「ゲーム」と呼べる条件を三つに分ける
  2. 全員が無作為なら、選択の価値は消える
  3. 人が相手のときの記録を設計する
  4. 結果の読み方と起こりやすい誤り
  5. 無作為の相手で、自分の癖が効かないことを確かめる
  6. 次の行動

「ゲーム」と呼べる条件を三つに分ける

問いを動かしやすくするため、ゲームらしさを三つの条件に分けます。厳密な定義ではなく、この記事の分析用の物差しです。

  1. 選択がある:プレイヤーが複数の行動から選べます。
  2. 選択が結果に効く:選んだ内容によって、勝つ見込みが変わります。
  3. 結果が確定しきっていない:始める前に勝敗が決まっていません。

じゃんけんは、一つ目と三つ目を満たしています。三つの手から選べますし、勝敗は出すまで分かりません。問題は二つ目です。

相手が完全に無作為(どの手も同じ確率で、前の手とも無関係)に出すと仮定します。この場合、自分がグーを出してもパーを出しても、勝ち・引き分け・負けの確率は同じ3分の1ずつです。どう選んでも見込みが変わらないので、二つ目の条件は満たされません。ここまでは「選択の形をした運」と言えます。

一方、相手が人間なら話が変わります。人は無作為に出し続けるのが苦手だと、一般にしばしば言われます。偏りがあれば、そこに合わせた手が有利になります。つまり二つ目の条件は、相手の出し方に偏りがあるかどうかで成立したりしなかったりします。ここが検証の対象です。

全員が無作為なら、選択の価値は消える

ゲーム理論には、「誰も自分の戦略を変えて得をしない状態」を均衡と呼ぶ考え方があります。じゃんけんでは、三つの手を3分の1ずつ無作為に出す状態がこれにあたります。

相手がこの出し方をしているとき、こちらがグーばかり出しても、毎回違う手を出しても、期待できる勝率は変わりません。つまり「最善の戦略」は、考え抜いた手を選ぶことではなく、考えずに無作為に出すことになります。選択の自由があるのに、最善の選択が「選ばないこと」というところが、じゃんけんの変わった点です。

ただし、この均衡は「相手も無作為である」ことが前提です。相手が偏っていれば、こちらも偏らせて得をする余地が生まれます。心理が入り込む隙間は、この前提が崩れたところにあります。

人が相手のときの記録を設計する

ここからが分析の手順です。問いは次のとおりです。

人間の相手との対戦で、出す手に偏りや癖はあるか。あるとすれば、それを使って勝率を上げられるか。

準備するもの

  • 相手(家族や友人など、記録することに同意してくれる人)
  • 記録用の紙か表計算ソフト
  • 時計(任意。出すまでの間を揃えるため)

子どもと行う場合は、保護者が内容を説明し、本人が嫌がったらやめてください。記録には名前を書かず、「Aさん」「Bさん」のような記号にとどめます。何かを賭けるのも避けます。

記録の単位

1回の勝負を1行とし、次の三つを順番どおりに書きます。

  • 自分の手
  • 相手の手
  • 結果(勝・分・負)

順番を保つことが重要です。あとで「前回の手」と「今回の手」の関係を見るためです。引き分けのやり直しも1回として数えます。

回数

100回以上を目安にしてください。理由は計算で示せます。無作為な出し方で30回行った場合、グーの回数の期待値は10回で、ばらつき(標準偏差)は約2.6回です。ふつうに7〜13回程度の幅は出るので、30回では偏りと偶然を見分けにくくなります。100回なら標準偏差は約4.7回で、期待値の約33回に対して、多少ずれても偶然で説明がつく範囲が狭くなります。

集計は三種類

  • A. 手の頻度:相手のグー・チョキ・パーがそれぞれ何回か。
  • B. 前回から今回への移り方:前回グーを出した後に何を出したか、という3×3の表にします。行が前回の手、列が今回の手です。
  • C. 勝敗の後の変化:勝った直後に同じ手を続けたか、負けた直後に手を変えたか。

C について、勝った手を続けやすく、負けると変えやすいという傾向がよく話題になりますが、目の前の相手に当てはまるかは別問題です。自分の記録で確かめてください。

結果の読み方と起こりやすい誤り

偶然か偏りかの目安

目安として、期待値から標準偏差の約2倍以上離れていたら、偶然では少し珍しいと見なします。

  • 100回での手の頻度:1/3は約33回で、標準偏差は約4.7です。2倍は約9なので、約24〜42回に収まっていれば偶然の範囲と考えます。
  • 遷移表の1行:前回の手ごとに約33回の試行があるとすると、各マスの期待値は約11回で、標準偏差は約2.7です。2倍は約5なので、約6〜16回に収まっていれば偶然の範囲と考えます。

この数字は無作為な出し方を仮定した計算上の目安で、実際の結果ではありません。

判断の表

  • 頻度も遷移も目安の範囲内、解釈:相手は無作為に近い、ゲームとしての見え方:運の要素が強く、選択は効きにくい
  • 頻度が偏っている、解釈:好きな手や避ける手がある、ゲームとしての見え方:読んで勝てる余地がある
  • 遷移や勝敗後の変化に偏り、解釈:直前の展開に反応している、ゲームとしての見え方:読み合いが成立する

偏りを使えるかを検証する

偏りが見つかっても、使えるとは限りません。次の手順で確かめます。

  1. 前半の50回で、相手の偏りを探します。
  2. 見つかった偏りから、有利になる出し方を決めます(例:相手が最もよく出す手に勝つ手を出す)。
  3. 後半の50回で、その出し方を実践して勝率を記録します。
  4. 前半の勝率と比べます。

前半に見つけた偏りを前半のデータで確かめても、偶然を拾っただけの可能性が残ります。検証は必ず別のデータで行ってください。後半で勝率が上がらなければ、偶然の癖を見ていたことになります。

起こりやすい誤り

  • 自分の手の偏り:自分も無意識に癖を出します。自分の頻度も同じ表で集計し、偏りを確認してください。
  • 「無作為に出して」と頼む:頼むと、相手の出し方が普段と変わります。普段どおりで構いません。
  • 相手の学習:勝負を重ねると、相手が自分の癖に気づいて直すことがあります。偏りが途中で消えたら、前半と後半を分けて見てください。
  • 切り口の掘りすぎ:頻度、遷移、勝敗後の変化など、多くの切り口を試すと、偶然にずれたものが一つは見つかりやすくなります。目安を超えたものがあっても、先に決めた仮説と検証で再確認してください。

無作為の相手で、自分の癖が効かないことを確かめる

比較の基準を用意するため、無作為な相手との記録も取ってみましょう。次のコードは、CPUが三つの手を均等に出し、自分の手・CPUの手・結果を記録し、頻度と遷移を表示する最小のHTMLです。ブラウザで開くだけで動きます。

html
<!doctype html>
<meta charset="utf-8">
<title>じゃんけん記録</title>
<button data-h="0">グー</button>
<button data-h="1">チョキ</button>
<button data-h="2">パー</button>
<button id="reset">記録を消す</button>
<pre id="out">手を選んでください。</pre>
<script>
const N = ["グー", "チョキ", "パー"];
let log = [];
function judge(me, cpu) {
  if (me === cpu) return 0;
  return (me - cpu + 3) % 3 === 2 ? 1 : -1;
}
function show() {
  const c = [0, 0, 0];
  const t = [[0,0,0],[0,0,0],[0,0,0]];
  let w = 0, d = 0, l = 0;
  log.forEach((r, i) => {
    c[r.me]++;
    if (r.res > 0) w++; else if (r.res < 0) l++; else d++;
    if (i > 0) t[log[i - 1].me][r.me]++;
  });
  let s = "回数 " + log.length + "  勝 " + w + " 分 " + d + " 負 " + l + "\n";
  s += "自分の手: " + N.map((n, i) => n + c[i]).join(" ") + "\n";
  s += "前回→今回(グー/チョキ/パーの順)\n";
  t.forEach((row, i) => { s += N[i] + " → " + row.join(" / ") + "\n"; });
  s += "直近: " + log.slice(-5).map(r => N[r.me] + "-" + N[r.cpu]).join(", ");
  document.getElementById("out").textContent = s;
}
document.querySelectorAll("[data-h]").forEach(b => {
  b.onclick = () => {
    const me = +b.dataset.h;
    const cpu = Math.floor(Math.random() * 3);
    log.push({ me, cpu, res: judge(me, cpu) });
    show();
  };
});
document.getElementById("reset").onclick = () => { log = []; show(); };
</script>

使い方の例を挙げます。

  1. わざと同じ手ばかり出し続けて100回押し、勝・分・負の内訳を見ます。
  2. 別の日に、毎回違う手を選んで100回押し、同じ内訳を見ます。
  3. 二つを比べ、先ほどの目安(勝・分・負それぞれ約24〜42回)に収まっているかを確認します。

CPUが均等な無作為なら、自分の出し方は勝敗に効かないはずです。期待どおりなら、「選択が結果に効かない状態」を自分の手で再現できたことになります。そのうえで人間の相手の記録と比べ、どこが違うかを見てください。違いが出た部分が、心理の入り込む余地です。

次の行動

まず、家族や友人と100回分の記録を取り、頻度と遷移を数えてみてください。次に、前半と後半に分けて、見つけた偏りが検証できるかを確かめます。上のコードをindex.htmlとして保存すれば、アソバースに投稿する際の入口ファイルとしても使えますが、その場合は自分の言葉で遊び方を整えてから公開してください。