
武蔵野個別指導塾の特徴
【情報I】モデル化とシミュレーションを図解で総まとめ—モデルの種類・乱数・確率的シミュレーション|武蔵野個別指導塾

待ち人数の変化を例に、モデルの4分類、表計算での再現、乱数による来室判定を図と例題で学べます。試行結果のばらつきと、予測を読むときの前提まで確かめましょう。
よくあるのは、保健室の前の長椅子で順番を待ちながら、「今2人待っているなら、自分の番まで何分だろう」と考え、途中から来る人や対応時間の違いをどう数えればよいのか迷うという場面です。人数だけで答えを決めようとしても、順番の決まりや1人にかかる時間が決まっていなければ、計算は進みません。そこで、知りたいことに必要な条件を選び、扱いやすい形に表すのがモデル化です。
シミュレーションは、作ったモデルを使って、条件を変えたときの様子を調べる方法です。現実で繰り返し試しにくいことも、計算の上なら比べられます。ただし、細かい数字が出たからといって、未来がその数字どおりになるわけではありません。どの条件を残し、何を省いたかによって、結果の意味が変わります。
待ち人数を1分ずつ更新する計算から始め、表計算の行の増やし方、乱数と確率の対応、結果を判断するときの注意まで追っていきましょう。目標は、答えの数字と、その数字が成り立つ条件を一緒に説明できることです。
この単元で身につけること
- モデル化の目的を説明することです。現実をそっくり写すのではなく、調べたい問題に関係する特徴を選んで表します。待ち人数を調べるなら、椅子の色よりも来る人数と対応できる人数が必要です。
- モデルを2つの観点で分類することです。時間の変化を扱うかという観点と、偶然の要素を扱うかという観点を分けて考えます。4つの名称をただ横並びで覚えないようにします。
- 状態を順番に更新することです。初めの状態と変化の規則を決め、前の結果から次の結果を求めます。表計算でもプログラムでも、同じ規則を使えます。
- 乱数を出来事に対応させることです。数の大小で出来事を判定するときには、数の取り得る範囲と区切りを先に決めます。確率と、実際に起きた割合の違いも区別します。
- 結果を前提とともに評価することです。複数回の試行や条件の変更から、ばらつきや結果の変わりやすさを調べ、モデルが目的に合っているか見直します。
これまで学んだ変数・条件分岐・繰り返しは、状態を記録し、場合を分け、時間を進めるために使います。数学で学ぶ確率は、偶然の出来事をどのような割合で発生させるかを決める土台です。
基本の考え方
現実から必要な特徴を取り出す
モデルとは、現実のものや現象の特徴を、目的に合わせて簡略化して表したものです。模型のように形で表すこともあれば、図、表、式、文章で関係を表すこともあります。教室の配置図なら場所の関係、待ち人数の式なら人数の増減に注目しています。どちらが優れたモデルかは、何を知りたいかによって決まります。
たとえば長椅子を置けるか調べるなら、椅子と廊下の長さが必要です。一方、待つ人が増える時間帯を調べるなら、来室の頻度や対応時間が必要です。モデルを簡単にすることは、条件を適当に省くことではありません。目的に影響しそうな条件を残し、影響が小さいと考える条件をいったん省くという判断です。
ここでは、学習用の待ち行列として「1分ごとに人数を数える」「その1分の来室者を加えたあとで対応する」「対応する人を除いた、区切りの時点の待ち人数を記録する」と決めます。実際の保健室では状況に応じた対応が必要ですが、この計算はその判断を表すものではありません。人数の更新規則を学ぶため、全員を同じ扱いにした単純なモデルを使います。
モデル化の後には、計算を実行するシミュレーション、結果の整理、現実や目的との照合が続きます。結果に納得できなければ、入力の値だけでなく、規則そのものも見直します。モデル化とシミュレーションは、1度作って終わりという関係ではありません。
静的・動的と確定的・確率的は別の観点
静的モデルは、時間の経過による変化を直接扱わないモデルです。ある時点の部屋の配置図や、ある条件での費用の関係式などが当てはまります。動的モデルは、時間の経過による状態の変化を扱います。1分後、2分後の待ち人数を順番に求めるモデルはこちらです。「静的」は現実の対象が絶対に動かないという意味ではなく、そのモデルの中で時間変化を追わないという意味です。
確定的モデルは、同じ初期条件と入力なら、規則によって結果が一意に決まるモデルです。来室人数をあらかじめ決めて待ち人数を計算する場合が当てはまります。確率的モデルは、偶然の要素を確率で表して組み込みます。各分の来室の有無を確率に従って決めると、同じ設定でも試行ごとに待ち人数が変わり得ます。
図1のように、時間変化と偶然の有無は別々に考えます。動的だから必ず乱数を使うわけではありません。また、確率的だから必ず時間を進めるわけでもありません。ある瞬間の在室人数を確率分布から1回取り出すモデルなら、時間変化を追わない確率的モデルとして扱えます。

図1の縦と横を1つずつ判定すると、分類の根拠を言葉にできます。なお、部屋の図面と数式という表し方の違いは、静的・動的という分類とは別です。図で描いたことだけを理由に静的と判断しないようにしましょう。
表計算では1行を1回の更新に対応させる
動的モデルを計算するときは、状態、入力、規則、初期条件、終了条件を決めます。今回の状態は待ち人数、入力はその1分の来室人数です。初期条件を「開始時に2人待っている」、終了条件を「6分後まで調べる」とすれば、どこからどこまで計算するかが明確になります。
1分に最大1人へ対応できるなら、更新の式は「次の待ち人数 = max(0, 前の待ち人数 + 来室人数 − 1)」です。maxは、並べた値のうち最大のものを選ぶという意味です。人数が足りないときまで1を引いて負の人数にしないため、0と比べます。この規則では、その1分に来た人も同じ1分の対応対象になります。
表計算では、A列を経過時間、B列をその1分の来室人数、C列を対応後の待ち人数とします。A2に0、C2に2を入れ、B2は空欄にします。3行目に最初の1分を置き、A3に「=A2+1」、B3に来室人数、C3に「=MAX(0,C2+B3-1)」を入れます。A3とC3を下へコピーすると、参照先が1行ずつ移り、前の状態から次の状態を計算できます。
途中の行まで毎回C2を参照すると、前の結果が引き継がれません。コピー後のC4が「=MAX(0,C3+B4-1)」になっているかを確認すると、行と時間の対応がつかめます。入力のB列を変えれば、同じ規則で別の来室状況を試せます。乱数を使う前に、手計算できる短い入力でこの動きを確かめることが大切です。
例題で解き方を確かめる
例題1 分類の根拠を2つの観点から答える
部屋の机の位置を実際の寸法に基づいて表した配置図Aと、来室の有無を確率で決めて1分ごとの待ち人数を求めるモデルBがあります。AとBを、静的・動的、確定的・確率的の2つの観点から分類してください。Aには位置のばらつきなどの偶然の要素を含めないものとします。
- 時間の経過を追うか確認します。Aはある時点の配置を表すだけなので静的です。Bは1分ごとに状態を変えるので動的です。対象の名前ではなく、何を計算しているかを見るための手順です。
- 偶然の要素を組み込んでいるか確認します。Aは与えた寸法から配置が決まり、確定的です。Bは来室の有無を確率で決めるので確率的です。この確認によって、時間の観点と混同せずに判断できます。
- 2つの判定を組み合わせます。「Aは図だから静的」「Bは計算するから確率的」といった理由では、別の問題に対応できません。時間と偶然という判定軸を答えにも残します。
答え:Aは静的・確定的モデル、Bは動的・確率的モデルです。
例題2 同じ来室人数で対応人数を変える
開始時の待ち人数は2人です。その後6分間の来室人数は、順に1、0、2、1、0、1人です。各分で来室者を加えてから対応するものとして、1分に最大1人へ対応する場合と、最大2人へ対応する場合の待ち人数を求めてください。
- 初期値と更新する順番を書きます。0分の状態を2人として、来室者を加えたあとに対応人数を引きます。順番を先に決めるのは、来たばかりの人が同じ分の対応対象かどうかで結果が変わる場合があるためです。
- 最大1人の場合を1行ずつ求めます。1分後はmax(0, 2 + 1 − 1) = 2、2分後はmax(0, 2 + 0 − 1) = 1です。以後も直前の結果を引き継ぐと、3分後から6分後は2、2、1、1人になります。
- 最大2人の場合は、引く数を2に変えます。1分後は1人、2分後は0人です。3分目には2人来ますが、その分に2人へ対応するので3分後も0人です。4分後以降も0人になります。
- 同じ時間軸で比べます。条件の違い以外をそろえると、対応人数を増やした効果を読み取りやすくなります。図2では、各分の対応を終えた時点だけを点で表しています。

図2のように、最大2人の線は2分後に0へ下がります。ただし、点を結んだ線は区切りの値を見やすくするためのものです。分の途中に人数が小数で変化するという意味ではありません。また、待ち人数が0でも、その分に誰も来なかったとは限りません。
| 経過時間(分) | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
| 来室人数(人) | — | 1 | 0 | 2 | 1 | 0 | 1 |
| 最大1人への対応後(人) | 2 | 2 | 1 | 2 | 2 | 1 | 1 |
| 最大2人への対応後(人) | 2 | 1 | 0 | 0 | 0 | 0 | 0 |
最大1人の場合をPythonで確かめると、次のようになります。リストの最初に入れる2は0分の値なので、6回更新した結果は合計7個です。
arrivals = [1, 0, 2, 1, 0, 1]
waiting = 2
history = [waiting]
for arrival in arrivals:
waiting = max(0, waiting + arrival - 1)
history.append(waiting)
print(history)
出力は次のとおりです。
[2, 2, 1, 2, 2, 1, 1]
答え:1〜6分後の待ち人数は、最大1人なら2、1、2、2、1、1人、最大2人なら1、0、0、0、0、0人です。
例題3 乱数から来室の有無を決める
各分に1人が来る確率を0.4、誰も来ない確率を0.6とします。2人以上が同じ分に来ることは、このモデルでは考えません。0以上1未満の一様乱数uを使い、u < 0.4なら来室あり、それ以外は来室なしとします。得られた値が順に0.12、0.81、0.34、0.56、0.07、0.93、0.48、0.22、0.65、0.39だったとき、来室の回数と割合を求めてください。これらは判定を練習するために与えた値です。
- 乱数の範囲と区切りを確認します。0以上1未満の区間のうち、0以上0.4未満の長さは全体の0.4です。一様乱数では、この区間に入る確率を0.4として扱えるため、この判定を使います。
- それぞれの値を0.4と比べます。来室ありは0.12、0.34、0.07、0.22、0.39の5個です。乱数の値そのものを人数として足すのではなく、出来事が起きたかどうかに変換します。
- 回数を試行数で割ります。5 ÷ 10 = 0.5なので、この10回で来室があった割合は50%です。設定した確率40%と、試行で観測した割合50%は別の量です。
この判定は、条件分岐とカウンタで表せます。valuesは与えた値を保存したリストであり、このコード自体は新たな乱数を生成していません。
values = [0.12, 0.81, 0.34, 0.56, 0.07,
0.93, 0.48, 0.22, 0.65, 0.39]
count = 0
for u in values:
if u < 0.4:
count += 1
print(count, count / len(values))
出力は次のとおりです。
5 0.5
答え:来室は5回、来室があった割合は0.5、すなわち50%です。
例題4 複数回の結果をまとめて読む
ある確率的な待ち行列モデルを、同じ条件で繰り返し動かしました。1試行は「同じ初期状態から6分後まで計算すること」とし、6分後に3人以上待っていたかを記録します。20試行ずつ4組に分けたところ、該当する試行数は順に2、5、1、4でした。全80試行での割合と、組ごとの割合の最小値・最大値を求めてください。
- 数える対象を確認します。今回は来室した人数ではなく、終了時の条件を満たした試行数です。1試行の途中に何回3人以上になったかも数えていません。対象をそろえてから集計します。
- 該当数と総試行数を合計します。該当数は2 + 5 + 1 + 4 = 12、総試行数は20 × 4 = 80です。全体の割合は12 ÷ 80 = 0.15となります。
- 各組の割合も求めます。順に10%、25%、5%、20%なので、最小5%、最大25%です。全体では15%でも、小さい組に分けると値が揺れていることが読み取れます。
- 結果から言える範囲を確かめます。この15%は今回のモデルと試行での割合です。現実の保健室で同じ割合になると結論づけるには、来室や対応の設定が現実に合っているかの検討が必要です。
4組は試行数が等しいので、組ごとの割合を平均しても15%になります。試行数の違う組をまとめるときは、割合の単純平均ではなく、該当数の合計を総試行数で割ります。
答え:全体の割合は15%、組ごとの割合の最小値は5%、最大値は25%です。
つまずきやすいところと直し方
誤り1 更新順と人数の下限を省いてしまう
誤った書き方は「前の人数 + 来室人数 − 対応人数を、そのまま次の人数にする」です。前が0人、来室が0人、対応可能な人数が1人なら、結果は−1人になります。どこが違うかというと、対応可能な人数と、実際に対応した人数を同一視している点です。対応できる余裕があっても、人がいなければ人数は減りません。
正しい書き方は「maxで0を下限にする」です。また、来室を加える前に対応を終える別のモデルなら、「次の人数 = max(0, 前の人数 − 対応人数) + 来室人数」となります。前が0人、来室が1人、対応人数が1人のとき、先に来室する規則では0人、先に対応する規則では1人です。どちらを使うかを決めずに式だけ書くと、違う現象を計算してしまいます。
誤り2 確率40%なら10回中必ず4回だと思う
誤った書き方は「確率0.4なので、10回なら来室は必ず4回」です。どこが違うかというと、設定した確率を、有限回の試行で保証される回数に置き換えている点です。各分を独立に判定するモデルでは、前の分に来たことを理由に次の分を来室なしにする必要はありません。独立とは、前の結果が次の出来事の確率を変えないということです。
正しい書き方は「10回の来室回数の期待値は4回だが、実際の回数は変わり得る」です。図3のように、区間を0.4で分けて個々の値を判定します。左の区間の長さが40%であることと、10個の点の40%が必ずそこに入ることは違います。

図3の点は例題3の値です。0.4以上は右側に含めるという規則なので、境界と同じ値が出た場合も来室なしです。コンピュータの乱数には有限の精度があるため、境界をどちらに含めるかをコードで明確にしておきます。
新しく値を生成するPythonの例は次のとおりです。random()は0以上1未満の値を返します。ここでは疑似乱数という、計算の手順で作る乱数を使っています。
import random
rng = random.Random(14)
count = 0
for _ in range(20):
if rng.random() < 0.4:
count += 1
print(count, count / 20)
出力は次のとおりです。
10 0.5
14はシードと呼ばれる、疑似乱数を生成するための初期設定です。同じ生成方法でシードと乱数を取り出す順序をそろえると、同じ列を再現でき、計算の確認に役立ちます。ただし、毎回シードを14に戻して同じ20回を再実行しても、新しい20回分の情報を得たことにはなりません。反復のたびに初期化せず、生成を続けるなど、異なる乱数列を使う必要があります。
表計算でも、一般的なRAND関数で得る0以上1未満の値を、IF関数で0または1へ変えられます。たとえばD3に「=RAND()」、B3に「=IF(D3<0.4,1,0)」と入れ、前述の待ち人数の式につなぎます。再計算で乱数が変わる場合があるので、比較に使う入力は値として別の列に保存し、どの値で計算したかを残します。
誤り3 回数を増やせば現実にも必ず当たると思う
誤った書き方は「試行を十分増やしたので、現実の待ち時間も正確に予測できる」です。どこが違うかというと、乱数によるばらつきと、モデル自体の現実とのずれを混同しています。適切な独立性などの条件のもとで試行数を増やすと、観測した割合は設定した確率に近づく傾向があります。しかし、100回目より101回目のほうが必ず近いという意味ではありません。
正しい書き方は「試行を増やしてモデル内の傾向を調べ、別にモデルの前提を確かめる」です。たとえば休み時間に来室が集中するのに、毎分一定の確率で独立に来ると置けば、混雑の形を表し損ねることがあります。1分に最大1人だけ来るという設定では、複数人が一緒に来る状況も表せません。試行回数を増やしても、省いた条件が自動で加わるわけではありません。
平均だけを見ることにも注意が必要です。平均待ち人数が小さくても、特定の試行では人数が多くなる可能性があります。何を改善したいかに合わせ、最大値、一定人数以上になる割合、時間ごとの変化なども見ます。なお、このモデルが直接出しているのは待ち人数です。個々の人の待ち時間を求めるには、到着時刻や対応を始めた時刻を記録するなど、別の情報が必要です。
練習問題
練習1
初めの水量を10Lとし、1分ごとに必ず2Lずつ増やして5分後まで求めるモデルがあります。容器からあふれることは考えません。静的・動的、確定的・確率的の2つの観点で分類し、5分後の水量も答えてください。
練習2
初めの待ち人数は1人です。来室人数は4分間で順に0、2、0、1人、対応可能な人数は毎分1人です。例題2と同じく、来室者を加えてから対応するものとして、各分の対応後の待ち人数を答えてください。
練習3
0以上1未満の一様乱数uに対して、u < 0.3なら当たりとします。得られた値は0.05、0.30、0.74、0.29、0.99、0.12です。当たりの回数と割合を求め、0.30をどう判定したかも説明してください。
練習4
同じモデルの異なる乱数列による試行で、条件を満たすものが、最初の10試行では2回、次の30試行では3回ありました。全40試行で条件を満たす割合を求めてください。また、この割合が現実でも同じになると言い切れない理由を1つ挙げてください。
答えと解説
練習1の答えは、動的・確定的モデル、20Lです。時間ごとの水量を追うので動的で、初めの量と増える量から結果が決まるので確定的です。5分間で2 × 5 = 10L増えるため、初めの10Lと合わせて20Lになります。
練習2の答えは、順に0、1、0、0人です。最初はmax(0, 1 + 0 − 1) = 0、次はmax(0, 0 + 2 − 1) = 1となります。最後の分は1人来ていますが、その分に対応を終えるため、記録する待ち人数は0人です。
練習3の答えは、3回、50%です。当たりは0.05、0.29、0.12で、3 ÷ 6 = 0.5です。0.30は0.3と同じ数なので「0.3未満」を満たさず、外れです。設定した確率30%と今回の割合50%が異なっていても、それだけでは判定規則の誤りとはいえません。
練習4の答えは、12.5%です。該当数を足すと5回、試行数を足すと40回なので、5 ÷ 40 = 0.125となります。各組の20%と10%を単純平均した15%は誤りです。現実について言い切れない理由は、モデルで設定した来室の確率や対応の規則が、現実と一致するとは限らないためです。
次の単元へのつながりと家庭での確かめ方
シミュレーションの結果は、そのままでは大量の数値です。次に学ぶデータの分析や可視化では、時間の変化を折れ線で示したり、試行ごとの結果の散らばりを調べたりします。平均を求める前に「何を1つのデータと数えたのか」をそろえる考え方は、例題4の集計からつながっています。
家庭で5分ほど使えるなら、1つ目は練習2の人数を小さな紙片で再現する方法です。1分ごとに来室人数の紙片を足し、最大1枚を取り除いて残りを記録します。計算式の足し算、引き算、0を下限にする処理が、それぞれ何をしているかを確かめられます。
2つ目は、例題3の同じ10個の値で、来室の条件をu < 0.4からu < 0.5へ変える方法です。今度は0.48も来室ありになり、合計6回になります。入力をそろえて条件だけを変えると、どの判定が変化を生んだか説明できます。これは条件の変化に対して結果がどう変わるかを調べる、感度分析の入口です。
個別指導で確かめるときも、いきなり長いプログラム全体を読むのではなく、1回分の更新と0分の初期値まで戻ります。保護者の方がお子さまの説明を聞く場合は、答えの数字に加えて「何を変えずに比べたのか」を話してもらうと、前提を整理できているかを確かめやすくなります。
まとめ
画面に出た1つの数字だけでは、予測の意味は決まりません。同じ15%でも、何を1試行とし、どの出来事を数え、どの条件で計算したかが違えば、判断の材料としての意味も違います。数字を説明するときに前提へ戻れることが、シミュレーションを問題解決に使う力につながります。
現実と合わない結果が出たときにも、計算の誤りなのか、偶然のばらつきなのか、省いた条件の影響なのかを分ければ、次に直す場所を考えられます。予測の信頼性を支えるのは、結果の桁数ではなく、問い直せる前提です。
本気になった日が、入塾の日。
お子様の教育、迷ったら「丸投げ」してください。必ず、期待以上の結果で返します。武蔵野で育む、武蔵境で学ぶ。
電話は年中無休。365日、24時間、お電話可能。




