プログラミングを学ぶ際、生徒に身近な題材を使って、実感できるようにすることが重要です。シミュレーションを行う際にも、最初はあまり複雑なものにせず、シンプルな話題が取り組みやすいでしょう。
最もシンプルで簡単なシミュレーションとして「サイコロ」などが取り組みやすいと思います。変数名などは指定せず、生徒に自分で考えさせたり、あえてシミュレーション回数を問題に含めず、自分で決めさせるなど、少し曖昧にするとより自身で考える力がつくと思います。また、あまり手順を詳しく説明せず、結果のイメージを与えることによって「何をすべきか」を生徒自身に読み取らせることも有効です。
Pythonを用いて、以下の6つの簡単な問題でシミュレーションを体験する例題を提示します。
randomモジュールの使い方、結果のリストへの追加、結果の表示などについて段階的に学べる構成になっています。
なお、「プログル情報」では先生のオリジナル問題を生徒に出題し、それぞれの生徒からコードを回収し、一覧表示することができます。
以下の問題もコピペで簡単に授業に取り入れられますので、ぜひ試してみてください。
①実行すると、「1〜6」のいずれかの数値が表示されるプログラムを作成してください。何度か実行して、毎回ランダムに結果が変わることを確認してください。
(このプログラムには random モジュールを使います)
解答例: import random dice = random.randint(1,6) print(dice)
②繰り返し処理を使って、「1〜6」のいずれかの数値が10回表示されるようなプログラムを作成してください。
解答例: import random for i in range(10): dice = random.randint(1,6) print(dice)
③「1〜6」の数値が、指定した回数ぶん表示されるプログラムを作成してください。(繰り返す回数は変数で指定します)
解答例: import random kaisu = 10 for i in range(kaisu): dice = random.randint(1,6) print(dice)
④サイコロを指定した回数ぶん振り、その「出た目の履歴」をリストとして記録し、最後にそのリストを表示するプログラムを作成してください。
(出た目を一つずつ表示するのではなく、リストとしてまとめて表示してください)
結果のイメージ(10回を指定した場合):[3, 5, 2, 6, 1, 3, 3, 4, 2, 6]
解答例: import random kaisu = 10 result = [] for i in range(kaisu): dice = random.randint(1,6) result.append(dice) print(result)
⑤サイコロを指定した回数ぶん振り、「1〜6の目がそれぞれ何回出たか」を数えて、回数をリストで表示するプログラムを作成してください。
(出た目の履歴は記録せず、直接カウントしてください)
結果のイメージ(10回を指定し、1が2回、2が1回、3が3回、4が2回、5が0回、6が2回出た場合):[2, 1, 3, 2, 0, 2]
【補足解説】
リストのインデックスは0から始まるため、出目が1の場合は kekka[0]、出目が6の場合は kekka[5] にカウントを追加する必要があります。
そのため、dice – 1 のようにして、出目とリストの位置を対応させます。
解答例: import random kaisu = 10 kekka = [0,0,0,0,0,0] for i in range(kaisu): dice = random.randint(1,6) kekka[dice-1] = kekka[dice-1] + 1 print(kekka)
⑥サイコロを1000回振り、「1〜6」のそれぞれの目が何回出たかリスト形式で表示し、またそれぞれの目が何%ずつであったかを表示するプログラムを作成してください。
確率は小数第1位まで表示してください。
実行結果のイメージ:[152, 147, 171, 182, 178, 170]1 ; 15.2 %
2 ; 14.7 %
3 ; 17.1 %
4 ; 18.2 %
5 ; 17.8 %
6 ; 17.0 %
解答例: import random kaisu = 1000 kekka = [0,0,0,0,0,0] for i in range(kaisu): dice = random.randint(1,6) kekka[dice-1] = kekka[dice-1] + 1 print(kekka) for j in range(6): print(j+1, ";", round(kekka[j]/kaisu*100, 1), "%")