Zenn
✌️

親子パソコン教室:Pythonで学ぶ! じゃんけんゲームと 確率(かくりつ)・ 期待値(きたいち)

2025/02/08に公開
1

以下に、小学3年生向けのやさしい言葉づかいでまとめた**「親子パソコン教室:Pythonで学ぶ! じゃんけんゲームと 確率**(かくりつ)・ 期待値(きたいち)**」**の教材を、ふりがな入りで再掲します。
時間はおよそ30分程度を想定しています。


親子パソコン教室:Pythonで学ぶ! じゃんけんゲームと 確率(かくりつ)・ 期待値(きたいち)

1. はじめに

今日のめあては、Pythonというプログラミングを使って、

  1. じゃんけんゲームを動かす。
  2. 勝った回数や勝率を調べて、確率(かくりつ)を学ぶ。
  3. グリコじゃんけんを動かして、勝ったときにもらえるポイント期待値(きたいち)を学ぶ。
  4. 期待値(きたいち)を知っている人と知らない人では、じゃんけんの出しかたがどう変わるかを考える。
  5. 最後に、AIにプログラムについて質問する。

時間はだいたい30分くらいです。さあ、いっしょにやってみましょう!


2. Google Colab のじゅんび

  • Gmailアカウントを持っていれば、Google ドライブの「+ 新規」→「その他」→「Google Colaboratory」をクリックすると、新しいノートブック(学習ノート)が開きます。
  • 開いたら、まずはコードを書くセル(箱)があるので、そこにPythonのプログラムを書いて、再生ボタン(▶)をおすとコードが動きます。

3. まずはふつうのじゃんけんゲームを作ろう

3-1. 1回じゃんけんしてみる

じゃんけんには、「グー ✊」「チョキ ✌️」「パー ✋」の3つがあります。
以下のコードをColabにうって、実行してみましょう。

ミッション

  • グー、チョキ、パーのどれかを入力する。
import random

# コンピュータが出す手のリスト
hands = ["グー", "チョキ", "パー"]

# プレイヤーが手を入力する
player = input("グー、チョキ、パーのどれを出す? ")

# もしプレイヤーの手がリストにない場合は反則負け
if player not in hands:
    print("反則負けです。")
else:
    # コンピュータがランダムに手をえらぶ
    computer = random.choice(hands)
    print("コンピュータは", computer, "を出しました。")

    # 勝ち負けの判定をする
    if player == computer:
        print("あいこです。")
    elif (player == "グー" and computer == "チョキ") \
         or (player == "チョキ" and computer == "パー") \
         or (player == "パー" and computer == "グー"):
        print("あなたの かち!")
    else:
        print("あなたの まけ。")
  • ここで、random.choice(hands) がコンピュータの手をランダムに決めるポイントです。
  • うまく動いたら、「グー」を出してみたり、「チョキ」を出してみたり、いろいろ入力して試してみましょう。
  • 「グー, チョキ, パー」以外を出したらどうなるかな?

3-2. 何回かやって、勝率(しょうりつ)を見てみる

じゃんけんを5回くりかえして、「勝った」「負けた」「あいこ」をそれぞれ何回か数えてみましょう。
最後に勝率(勝った回数 ÷ 全体の回数)も計算してみます。

ミッション

  • グー、チョキ、パーのどれかを5回入力する。
  • 勝率を確認する。
import random

hands = ["グー", "チョキ", "パー"]

win_count = 0   # 勝った回数
lose_count = 0  # 負けた回数
draw_count = 0  # あいこの回数

# 5回じゃんけんをする
for i in range(5):
    player = input(f"{i+1}回目のじゃんけん! グー、チョキ、パーのどれを出す? ")
    computer = random.choice(hands)
    print("コンピュータは", computer, "を出しました。")

    if player == computer:
        draw_count += 1
        print("あいこです。")
    elif (player == "グー" and computer == "チョキ") \
         or (player == "チョキ" and computer == "パー") \
         or (player == "パー" and computer == "グー"):
        win_count += 1
        print("あなたの かち!")
    else:
        lose_count += 1
        print("あなたの まけ。")

    print("------------------")

print("【じゃんけん結果】")
print("勝ち:", win_count, "回")
print("負け:", lose_count, "回")
print("あいこ:", draw_count, "回")

# 勝率 (あいこもふくむ全体の中で勝った割合)
win_rate = win_count / 5
print("勝率:", win_rate)
  • 「あいこ」を含んだ全体の試合数5回のうち、何回勝ったかを計算して勝率を出します。
  • もし5回のうち2回勝ったら、勝率 = 2/5 = 0.4(40%)というイメージです。

面倒くさい!

その気持は大事にしてください。
「めんどうくさーい」は発明のもと。

4. 確率(かくりつ)について考えよう:理論(りろん)と実験(じっけん)

4-1. ランダム同士のじゃんけん(5回から10回に変更)

もっと 確率(かくりつ) を体感するために、

  • プレイヤーの手もランダムにしてしまい、
  • 試合回数も10回にへんこうして、何回勝つかを数えてみます。

変更点まとめ

  1. 対戦回数の変更

    • for i in range(5):for i in range(10): に変更して、10回試合をするようにしました。
  2. プレイヤーの入力をランダムに変更

    • player = input(...)player = random.choice(hands) に変更しました。

完全版コード

import random

hands = ["グー", "チョキ", "パー"]

# 総試合数 (好きな回数に変更してください)
num_rounds = 30  # 例: 30回じゃんけん

win_count = 0
lose_count = 0
draw_count = 0

# 各回の結果を覚えておくためのリスト
results = []

for i in range(num_rounds):
    player = random.choice(hands)
    computer = random.choice(hands)

    # 勝ち負けの判定
    if player == computer:
        draw_count += 1
        result_text = "あいこ"
    elif (player == "グー" and computer == "チョキ") \
         or (player == "チョキ" and computer == "パー") \
         or (player == "パー" and computer == "グー"):
        win_count += 1
        result_text = "プレイヤーのかち!"
    else:
        lose_count += 1
        result_text = "プレイヤーのまけ。"

    # 結果を覚えておく (回数, プレイヤーの手, コンピュータの手, その回の結果)
    results.append((i+1, player, computer, result_text))


# ---------------------------------------
# 最後の10回の結果だけを表示
# ---------------------------------------
# もし総試合数が10未満なら、すべて表示されます
print("【最後の10回の対戦結果】")

# -10スライスで最後の10要素を取り出す
last_10 = results[-10:]

for round_num, p_hand, c_hand, r_text in last_10:
    print(f"{round_num}回目: あなたは{p_hand}、コンピュータは{c_hand}{r_text}")
print()

# ---------------------------------------
# 全体の結果をまとめて表示
# ---------------------------------------
print(f"【全{num_rounds}回の結果】")
print("勝ち:", win_count, "回")
print("負け:", lose_count, "回")
print("あいこ:", draw_count, "回")

# 勝率 (あいこをふくむ)
win_rate = win_count / num_rounds
print("勝率(あいこをふくむ):", win_rate)

# あいこをのぞく
non_draw_games = num_rounds - draw_count
if non_draw_games > 0:
    win_rate_no_draw = win_count / non_draw_games
    print("勝率(あいこをのぞく):", win_rate_no_draw)
else:
    print("あいこだけだったので、あいこをのぞいた勝率は計算できません。")

ミッション

  • num_rounds の値を変える。例:num_rounds = 100
  • 確率を確認する。

4-2. 理論(りろん)上の勝率はどうなる?

  • じゃんけんは 3つの手(グー・チョキ・パー) をランダムに出すと、
    1/3くらいの 確率(かくりつ) で「あいこ」
    2/3くらいの 確率(かくりつ) で「勝ち負けがつく」
  • あいこをのぞくと、プレイヤーとコンピュータは半分ずつ勝つはずなので、
    **勝率は50%**に近づくと考えられます。
  • 何度も実験してみると、最初は大きくズレても、**試行回数(しこうかいすう)**を増やす(100回, 1000回)ほど
    だんだん50%に近づくことが多いです。

5. グリコじゃんけんをやってみよう

5-1. グリコじゃんけんのルール

【ルール】

  • グーで勝った場合は「グリコ!」と言いながら 3ポイント 進む
  • チョキで勝った場合は「チヨコレイト!」と言いながら 6ポイント 進む
  • パーで勝った場合は「パイナツプル!」と言いながら 6ポイント 進む
  • まけた時、あいこの時は 0ポイント (進まない)

実際のあそびでは「○○歩進む」というかたちですが、ここではポイントをためるかたちでやってみましょう。

5-2. コードを動かしてみよう。

ミッション

  • じゃんけんゲームを実行する。
import random

hands = ["グー", "チョキ", "パー"]

point = 0  # グリコじゃんけんのポイント

# 5回じゃんけんをする
for i in range(5):
    player = input(f"{i+1}回目のグリコじゃんけん! グー、チョキ、パーのどれを出す? ")
    computer = random.choice(hands)
    print("コンピュータは", computer, "を出しました。")

    if player == computer:
        print("あいこ。ポイントはもらえません。")
    elif (player == "グー" and computer == "チョキ"):
        print("グーで勝ち!グリコ!3ポイントゲット!")
        point += 3
    elif (player == "チョキ" and computer == "パー"):
        print("チョキで勝ち!チヨコレイト!6ポイントゲット!")
        point += 6
    elif (player == "パー" and computer == "グー"):
        print("パーで勝ち!パイナツプル!6ポイントゲット!")
        point += 6
    else:
        print("まけ!ポイントはもらえません。")
    print("------------------")

print("【グリコじゃんけんの結果】")
print("あなたの合計ポイント:", point)

6. 期待値(きたいち)ってなに?

「グーで勝つと3ポイント、チョキで勝つと6ポイント、パーで勝つと6ポイント」を考えたとき、

  • 手をランダムに出すあいてと戦うなら、3つの手の 勝つ 確率(かくりつ) はそれぞれ1/3ずつぐらい。
  • グーで勝ったら3ポイント → 期待値(きたいち) = 3 × (1/3) = 1ポイント
  • チョキで勝ったら6ポイント → 期待値(きたいち) = 6 × (1/3) = 2ポイント
  • パーで勝ったら6ポイント → 期待値(きたいち) = 6 × (1/3) = 2ポイント

つまり、期待値(きたいち) だけを考えると、チョキやパーを出したほうが効率よくポイントがもらえそうです。


7. 期待値(きたいち)を知っている人 vs. しらない人

  1. 相手が 期待値(きたいち)をしらないで、たとえば「グー」ばかり出すなら、こちらはパーを出すと勝ちやすいですね。
  2. でも相手も 期待値(きたいち)をしっていて「パー」が強いとわかっていたら…?
    • こちらは「チョキ」でパーに勝てます。
    • そうすると、相手がチョキを読んで「グー」に変えてくるかも…?
  3. おたがいが読みあいをすることで、チョキ→パー→グー…のように相手の出しかたが変わっていきます。
    これを
    戦略
    (せんりゃく)と言います。

じゃんけんをただの運ゲーにせず、「どれを出すのが良いか?」を考え合うところが、期待値(きたいち) を学ぶおもしろさになります。


8. まとめと今後のアレンジ

  1. Pythonを使って、じゃんけんゲームを作り、勝ち数や勝率をしらべることができました。
  2. 確率(かくりつ)や期待値(きたいち)を考えると、どの手を出せばポイントが大きいのか見えてきます。
  3. おたがいが 期待値(きたいち) をしっていると、相手の手を読もうとする戦略(せんりゃく)が生まれてゲームがもっとおもしろくなります。

おまけのアイデア

  • **試行回数(しこうかいすう)**を 100回、1000回 にふやして、勝率やポイントがどんなふうにかわるかをグラフにしてみよう。
  • 「パーを多めに出す」「チョキばかり出す」など、コンピュータのほうをわざと偏らせてみて、期待値(きたいち)がどう変わるかを調べても楽しいです。

これで教材の完全版はおしまいです。
短い時間で遊びながら、プログラミングの基本や、確率(かくりつ)・期待値(きたいち)の考え方が体験できます。
ぜひ親子いっしょに、あーでもないこーでもないと話しながら楽しんでみてくださいね。

9. おまけと言う名の本体

下のチャット欄でAIに質問してみうよう。
例:グリコじゃんけんの必勝法は?

1

Discussion

ログインするとコメントできます