2026年5月12日
シミュレーション問題を攻略しよう
共通テストで「シミュレーション」の問題が出ます。現実の現象をプログラムで再現し、結果を予測する問題です。乱数(らんすう。ランダムに生成される数)を使った処理が中心になるため、初めて見ると戸惑いますが、パターンを知れば読み解けます。
情報Ⅰ共通テスト対策スケジュールで全体の学習計画を確認しましょう。
シミュレーションの基本
モデル化とは:現実の複雑な現象を、プログラムで扱えるように単純化すること。例えば「サイコロを振る」を「1〜6の乱数を生成する」とモデル化します。
シミュレーションとは:モデル化した現象をプログラムで何度も実行し、結果の傾向を調べること。1000回サイコロを振って、各目の出る確率を確認するなど。
共通テストでの出題のしかた:実際の試験では「乱数を発生させた結果」があらかじめ配列として与えられ、それをトレース(値の変化を追うこと)させる形式が多く出ます。つまり乱数そのものより、「配列の値を順番に見て条件判定し、カウントする」という基本の型が身についているかが問われます。
よく出るパターン
- 乱数を使った確率シミュレーション:サイコロ、コイン投げ、くじ引き
- 待ち行列シミュレーション:レジの待ち時間、窓口の混雑
- モンテカルロ法:乱数で円周率などを近似する
テストでの出題形式:シミュレーションのコードが与えられ、「何回実行したら結果はどうなるか」「空欄に入る処理は何か」を問われます。
コード例1:サイコロで特定の目が出た回数を数える
配列 random に「乱数で生成されたサイコロの目」が10回分入っているとします。このうち「6」が出た回数を数えるプログラムです。
random ← {3, 1, 4, 6, 2, 6, 5, 3, 6, 1}
count ← 0
i を 1 から 10 まで 1 ずつ増やしながら繰り返す
もし random[i] = 6 ならば
count ← count + 1
を実行する
を実行する
表示する(count) → 出力: 3 トレース:配列の中身は { 3, 1, 4, 6, 2, 6, 5, 3, 6, 1 }。6が現れるのは4番目・6番目・9番目の3か所なので、countは最終的に3になります。10回中3回なので、確率は 3÷10 = 0.3 と推定できます。
コード例2:モンテカルロ法で円周率を近似する
モンテカルロ法とは、乱数を大量に発生させて図形の面積や確率を近似する手法です。1辺1の正方形の中にランダムな点を打ち、そのうち半径1の円(の4分の1)の内側に入った点の割合から円周率を推定します。判定は「x² + y² ≦ 1 なら円の内側」で行います。
x ← {0.3, 0.9, 0.5, 0.8, 0.95}
y ← {0.4, 0.9, 0.5, 0.1, 0.4}
inside ← 0
i を 1 から 5 まで 1 ずつ増やしながら繰り返す
もし x[i] × x[i] + y[i] × y[i] ≦ 1 ならば
inside ← inside + 1
を実行する
を実行する
pi_est ← 4 × inside ÷ 5
表示する(pi_est) → 出力: 2.4 トレース:各点についてx²+y²を計算します。
- (0.3, 0.4):0.09 + 0.16 = 0.25 ≦ 1 → 内側
- (0.9, 0.9):0.81 + 0.81 = 1.62 > 1 → 外側
- (0.5, 0.5):0.25 + 0.25 = 0.5 ≦ 1 → 内側
- (0.8, 0.1):0.64 + 0.01 = 0.65 ≦ 1 → 内側
- (0.95, 0.4):0.9025 + 0.16 = 1.0625 > 1 → 外側
内側は3点、全体は5点なので inside は3。pi_est = 4 × 3 ÷ 5 = 2.4 となります(点の数が少ないため実際の円周率3.14…とは誤差がありますが、試行回数を増やすほど近づきます)。
解き方のコツ
- 「何をモデル化しているか」を把握する:問題文から現実の現象を特定
- 乱数の範囲を確認する:「1〜6の整数乱数」=サイコロ
- 繰り返し回数を確認する:「10回繰り返す」=試行回数
- カウント変数に注目する:「条件を満たした回数」を数えている
- 最終的に何を求めているか確認する:確率=回数÷試行回数
擬似コード読解で読解力を鍛えましょう。DNCLの読み方攻略で乱数の扱い方を確認。配列操作の解き方も合わせて学びましょう。過去問の解き方で実践練習。
練習問題
問題1
次は配列 random に入った10回分のサイコロの目のうち、「偶数の目が出た回数」を数えるプログラムです。空欄[ア]に入る条件と、最後に表示される値を答えよ。
random ← {2, 5, 3, 6, 1, 4, 6, 2, 5, 3}
count ← 0
i を 1 から 10 まで 1 ずつ増やしながら繰り返す
もし [ア] ならば
count ← count + 1
を実行する
を実行する
表示する(count) 解答:[ア]は random[i] を 2 で割った余りが 0(偶数判定)。配列の中身は { 2, 5, 3, 6, 1, 4, 6, 2, 5, 3 }。偶数は2, 6, 4, 6, 2の5個なので、表示される値は5。
問題2
次は配列 random の10個の値のうち「5以上の目が出た確率」を求めるプログラムです。最後に表示されるprobの値を答えよ。
random ← {5, 3, 6, 2, 4, 1, 6, 6, 3, 5}
count ← 0
trial ← 10
i を 1 から trial まで 1 ずつ増やしながら繰り返す
もし random[i] ≧ 5 ならば
count ← count + 1
を実行する
を実行する
prob ← count ÷ trial
表示する(prob) 解答:配列の中身は { 5, 3, 6, 2, 4, 1, 6, 6, 3, 5 }。5以上なのは 5, 6, 6, 6, 5 の5個なので countは5、prob = 5 ÷ 10 = 0.5。
問題3
次はモンテカルロ法で円周率を近似するプログラムです。6個の点(x, y)について、最後に表示されるpi_estの値を答えよ。
x ← {0.2, 0.7, 0.6, 0.9, 0.1, 0.4}
y ← {0.9, 0.7, 0.3, 0.9, 0.2, 0.4}
inside ← 0
trial ← 6
i を 1 から trial まで 1 ずつ増やしながら繰り返す
もし x[i] × x[i] + y[i] × y[i] ≦ 1 ならば
inside ← inside + 1
を実行する
を実行する
pi_est ← 4 × inside ÷ trial
表示する(pi_est) 解答:各点でx²+y²を計算すると、(0.2,0.9)=0.85≦1(内側)、(0.7,0.7)=0.98≦1(内側)、(0.6,0.3)=0.45≦1(内側)、(0.9,0.9)=1.62>1(外側)、(0.1,0.2)=0.05≦1(内側)、(0.4,0.4)=0.32≦1(内側)。内側は5点、全体は6点なので insideは5、pi_est = 4 × 5 ÷ 6 = 約3.33。
まとめ
- ✅ シミュレーション=現実をプログラムで再現して傾向を調べる
- ✅ モデル化=現実を単純化してプログラムで扱えるようにする
- ✅ 共通テストでは乱数の結果が配列で与えられ、トレースさせる形式が多い
- ✅ カウント変数で「条件を満たした回数」を追う
- ✅ 確率=回数÷試行回数、モンテカルロ法は「内側の点の割合×4」で円周率を近似