親子パソコン教室:Pythonで学ぶ! じゃんけんゲームと 確率(かくりつ)・ 期待値(きたいち)
以下に、小学3年生向けのやさしい言葉づかいでまとめた**「親子パソコン教室:Pythonで学ぶ! じゃんけんゲームと 確率**(かくりつ)・ 期待値(きたいち)**」**の教材を、ふりがな入りで再掲します。
時間はおよそ30分程度を想定しています。
親子パソコン教室:Pythonで学ぶ! じゃんけんゲームと 確率(かくりつ)・ 期待値(きたいち)
1. はじめに
今日のめあては、Pythonというプログラミングを使って、
- じゃんけんゲームを動かす。
- 勝った回数や勝率を調べて、確率(かくりつ)を学ぶ。
- グリコじゃんけんを動かして、勝ったときにもらえるポイントと期待値(きたいち)を学ぶ。
- 期待値(きたいち)を知っている人と知らない人では、じゃんけんの出しかたがどう変わるかを考える。
- 最後に、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回にへんこうして、何回勝つかを数えてみます。
変更点まとめ
-
対戦回数の変更
-
for i in range(5):
をfor i in range(10):
に変更して、10回試合をするようにしました。
-
-
プレイヤーの入力をランダムに変更
-
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. しらない人
- 相手が 期待値(きたいち)をしらないで、たとえば「グー」ばかり出すなら、こちらはパーを出すと勝ちやすいですね。
-
でも相手も 期待値(きたいち)をしっていて「パー」が強いとわかっていたら…?
- こちらは「チョキ」でパーに勝てます。
- そうすると、相手がチョキを読んで「グー」に変えてくるかも…?
- おたがいが読みあいをすることで、チョキ→パー→グー…のように相手の出しかたが変わっていきます。
これを戦略(せんりゃく)と言います。
じゃんけんをただの運ゲーにせず、「どれを出すのが良いか?」を考え合うところが、期待値(きたいち) を学ぶおもしろさになります。
8. まとめと今後のアレンジ
- Pythonを使って、じゃんけんゲームを作り、勝ち数や勝率をしらべることができました。
- 確率(かくりつ)や期待値(きたいち)を考えると、どの手を出せばポイントが大きいのか見えてきます。
- おたがいが 期待値(きたいち) をしっていると、相手の手を読もうとする戦略(せんりゃく)が生まれてゲームがもっとおもしろくなります。
おまけのアイデア
- **試行回数(しこうかいすう)**を 100回、1000回 にふやして、勝率やポイントがどんなふうにかわるかをグラフにしてみよう。
- 「パーを多めに出す」「チョキばかり出す」など、コンピュータのほうをわざと偏らせてみて、期待値(きたいち)がどう変わるかを調べても楽しいです。
これで教材の完全版はおしまいです。
短い時間で遊びながら、プログラミングの基本や、確率(かくりつ)・期待値(きたいち)の考え方が体験できます。
ぜひ親子いっしょに、あーでもないこーでもないと話しながら楽しんでみてくださいね。
9. おまけと言う名の本体
下のチャット欄でAIに質問してみうよう。
例:グリコじゃんけんの必勝法は?
Discussion