シミュレーション
プログラミング · シミュレーション · QUESTION 001
このプログラムは以下の条件で積立式の少額投資を30年間行った場合の資産総額をシミュレートするものである。
・毎年、年初に100万円ずつ追加で投資する。
・運用利回り(1年間で増える割合)は年ごとに1%~6%でランダムに変動する。
乱数()は0以上1未満の実数をランダムに返す関数である。
空欄に入る最も適切なものを選べ。
(1)tumitate = 1000000 #毎年の追加投資額
(2)kikan = 30 #投資期間(年)
(3)sougaku = 0 #資産総額
(4)i を 1 から kikan まで 1 ずつ増やしながら繰り返す:
(5)| sougaku = sougaku + tumitate
(6)| rimawari = ( ア )
(7)⎿ sougaku = ( イ )
(8)表示する("30年後の資産総額は", sougaku, "円")
( ア ):1以上6未満の実数
1.乱数() * 5
2.乱数() * 6
3.1 + 乱数() * 5
4.1 + 乱数() * 6
( イ )
1.sougaku * rimawari
2.sougaku * rimawari / 100
3.sougaku + sougaku * rimawari
4.sougaku + sougaku * rimawari / 100
答えと解説を見る
答えア 3.1 + 乱数() * 5
イ 4.sougaku + sougaku * rimawari / 100
解説乱数()は0以上1未満なので、1+乱数()×5は1以上6未満の利回りを作り、アは選択肢3です。
各年は年初に100万円を加えた後、その総額に対する利益sougaku×rimawari÷100を上乗せするため、イはsougaku+sougaku×rimawari÷100です。
プログラミング · シミュレーション · QUESTION 002
このプログラムはコインを20回投げるという試行を100セット行い、各セットで表が出た回数を度数分布表にまとめるものである。
乱数()は0以上1未満の実数をランダムに返す関数であり、配列の添字は0から始まるものとする。
空欄に入る最も適切なものを選べ。
(1)dosu = [0, ... ,0] #すべての要素が0,十分な要素数
(2)toss = 20, set = 100
(3)i を 1 から set まで 1 ずつ増やしながら繰り返す:
(4)| count = 0
(5)| j を 1 から toss まで 1 ずつ増やしながら繰り返す:
(6)| | もし 乱数() < 0.5 ならば:
(7)| ⎿ ⎿ count = count + 1
(8)⎿ ( ア )
(9)表示する("結果:", dosu)
1.dosu[j] = count
2.dosu[i] = count
3.dosu[count] = count
4.dosu[count] = dosu[count] + 1
答えと解説を見る
答え4.dosu[count] = dosu[count] + 1
解説各セットで表が出た回数をcountに数え、dosu[count]を1増やします。
countを添字にすることで、「表がn回だったセットが何回あったか」を度数分布として集計できます。
プログラミング · シミュレーション · QUESTION 003
ランダムに誕生日を生成していき、初めて同じ誕生日が現れるまでの回数をカウントするプログラムとなるように、空欄に入る最も適切なものを選べ。
ランダム日付()は1月1日から12月31日までの日付のうち一つをランダムに返す関数であり、要素追加(配列, 値)は配列の末尾に新しい要素を追加する関数である。
また、「配列 に 値 が含まれている」は配列に値が含まれているときに真となり、そうでなければ偽となるとする。
(01)Birthdays = [] #空の配列
(02)found = 0 , count = 0
(03)( ア ) の間繰り返す:
(04)| day = ランダム日付()
(05)| count = count + 1
(06)| もし Birthdays に day が含まれている ならば:
(07)| | ( イ )
(08)| そうでなければ:
(09)⎿ ⎿ 要素追加(Birthdays, day)
(10)表示する("同じ誕生日が見つかるまでの回数:", count)
( ア )( イ )
1.found = 0
2.found = 1
3.found == 0
4.found == 1
答えと解説を見る
答えア 3.found == 0
イ 2.found = 1
解説新しい値を既存配列へ追加する前に、同じ値があるかを調べます。
重複が見つかったらフラグを1にし、重複なしのときだけ追加します。
プログラミング · シミュレーション · QUESTION 004
ある感染症に人口の3%が罹患しているという。
現在使われている検査薬は、罹患している人に使用すると99%の割合で正しく陽性と判定し、罹患していない人に使用すると98%の割合で正しく陰性と判定する。
このプログラムは、この検査薬を1万人に使って陽性と判定された人のうち実際に罹患している人の割合を算出するものである。
乱数()は0以上1未満の実数をランダムに返す関数である。
空欄に入る最も適切なものを選べ。
(01)ninzu = 10000
(02)count1 = 0, count2 = 0
(03)i を 1 から ninzu まで 1 ずつ増やしながら繰り返す:
(04)| もし 乱数() < 0.03 ならば:
(05)| | もし 乱数() < 0.99 ならば:
(06)| | ⎿ ( ア )
(07)| そうでなければ:
(08)| | もし 乱数() < 0.02 ならば:
(09)⎿ ⎿ ⎿ ( イ )
(10)もし count1 > 0 ならば:
(11)| 表示する("検査で陽性のうち実際に罹患している割合は", 100 * count2 / count1, "%")
(12)そうでなければ:
(13)⎿ 表示する("陽性者はいませんでした。")
( ア )( イ )
1.count1 = count1 + 1
2.count2 = count2 + 1
3.count1 = count1 + 1, count2 = count2 + 1
4.count1 = count1 + i, count2 = count2 + i
答えと解説を見る
答えア 3.count1 =count1 + 1, count2 = count2 + 1
イ 1.count1 =count1 + 1
解説count1は陽性者全体、count2はそのうち実際に罹患している人を数えます。
罹患していて陽性なら両方を1増やすのでアは選択肢3、罹患していない人の偽陽性ではcount1だけを増やすのでイは選択肢1です。
プログラミング · シミュレーション · QUESTION 005
このプログラムはモンテカルロ法を用いて円周率の推定値を求めるものである。
乱数()は0以上1未満の実数をランダムに返す関数である。
空欄に入る最も適切なものを選べ。
(1)kaisu = 1000
(2)kosu = 0
(3)i を 1 から kaisu まで 1 ずつ増やしながら繰り返す:
(4)| x = 乱数()
(5)| y = 乱数()
(6)| もし x ** 2 + y ** 2 <= 1 ならば:
(7)⎿ ⎿ kosu = kosu + 1
(8)表示する("円周率の推定値は", ( ア ))
1.kosu / kaisu
2.2 * kosu / kaisu
3.4 * kosu / kaisu
4.kosu / kaisu / 4
答えと解説を見る
答え3.4 * kosu / kaisu
解説正方形の中にランダムな点を打ち、四分円の中に入った点の割合を数えます。
面積比はπ/4なので、割合を4倍するとπの近似になります。
プログラミング · シミュレーション · QUESTION 006
このプログラムはxy平面上を動く点をプロットするものである。
動く点は、各繰り返しごとにx軸方向に0.1、y軸方向に+1または-1だけ動く。
y軸方向に+1動くか-1動くかはランダムである。
乱数()は0以上1未満の実数をランダムに返す関数であり、要素追加(配列, 値)は配列の末尾に新しい要素を追加する関数である。
また、プロットする(配列X, 配列Y)は2つの配列の同じ添字の要素を組みとして、xy平面に座標をプロットして表示する関数である。
配列の添字は0から始まるものとする。
空欄に入る最も適切なものを選べ。
(01)kaisu = 1000
(02)X_zahyo = [0], Y_zahyo = [0]
(03)i を 0 から kaisu - 1 まで 1 ずつ増やしながら繰り返す:
(04)| もし 乱数() < 0.5 ならば:
(05)| | y_henka = 1
(06)| そうでなければ:
(07)| ⎿ y_henka = -1
(08)| 要素追加(X_zahyo,( ア ))
(09)⎿ 要素追加(Y_zahyo,( イ ))
(10)プロットする(X_zahyo, Y_zahyo)
( ア )
1.0.1
2.X_zahyo[i - 1] + 0.1
3.X_zahyo[i] + 0.1
4.X_zahyo[i + 1] + 0.1
( イ )
1.y_henka
2.Y_zahyo[i - 1] + y_henka
3.Y_zahyo[i] + y_henka
4.Y_zahyo[i + 1] + y_henka
答えと解説を見る
答えア 3.X_zahyo[i] + 0.1
イ 3.Y_zahyo[i] + y_henka
解説初期点(0,0)を配列に入れ、各回でxは0.1、yは乱数で+1または-1だけ移動します。
追加前の最後の点は添字iにあるため、次の座標をX_zahyo[i]+0.1、Y_zahyo[i]+y_henkaとして末尾に追加します。
これはランダムウォークの軌跡を作る処理です。
プログラミング · シミュレーション · QUESTION 007
1日で15個から25個売れる商品がある。
毎日20個ずつ仕入れた場合の7日目終了時点での在庫数をシミュレートする。
また、7日間で品切れを起こした(買おうとしたが買えなかった人がいた)日数も数える。
ランダム整数(n, m)はnからmの整数をランダムに返す関数である。
空欄に入る最も適切なものを選べ。
(01)siire = 20, kikan = 7
(02)zaiko = 0, sinagire = 0
(03)i を 1 から kikan まで 1 ずつ増やしながら繰り返す:
(04)| zaiko = zaiko + siire
(05)| hanbai = ランダム整数(15, 25)
(06)| もし zaiko >= hanbai ならば:
(07)| | ( ア )
(08)| そうでなければ:
(09)| | ( イ )
(10)⎿ ⎿ sinagire = sinagire + 1
(11)表示する("7日目終了時点の在庫数:", zaiko)
(12)表示する("品切れを起こした日数:", sinagire)
( ア )( イ )
1.zaiko = zaiko + hanbai
2.zaiko = zaiko - hanbai
3.zaiko = hanbai
4.zaiko = 0
答えと解説を見る
答えア 2.zaiko = zaiko - hanbai
イ 4.zaiko = 0
解説毎日20個を仕入れた後、15〜25個の販売数を引きます。
在庫が足りる日はzaiko=zaiko-hanbai、足りない日は在庫を0にしてsinagireを1増やします。
繰り返し後に7日目の在庫と品切れ日数を表示します。
プログラミング · シミュレーション · QUESTION 008
次のプログラムはあるコンビニに設置された1台のATMの平均待ち時間についてのシミュレーションである。
・このATMの作動時間は1日900分である。
・顧客は毎分0.1の確率で訪れる。
・顧客一人あたりのATM利用時間は2分から6分のランダムな時間である。
乱数()は0以上1未満の実数を返す関数であり、ランダム整数(n, m)はnからmの整数をランダムに返す関数である。
空欄に入る最も適切なものを選べ。
※ 読みやすくするため、変数名も日本語にしている。
(01)営業終了時刻 = 900
(02)現在時刻 = 0
(03)利用時間 = 0 #利用時間が0ならば利用可能状態
(04)待ち客数 = 0 #現在の待っている人数
(05)総待ち時間 = 0 #複数人いる場合重複して数える
(06)顧客数 = 0 #来客者数全体
(07)現在時刻 < 営業終了時刻 の間繰り返す:
(08)| もし 乱数() < 0.1 ならば:
(09)| | 待ち客数 = 待ち客数 + 1
(10)| ⎿ 顧客数 = 顧客数 + 1
(11)| もし 利用時間 > 0 ならば:
(12)| ⎿ 利用時間 = 利用時間 - 1
(13)| もし ( ア ) ならば:
(14)| | 利用時間 = ランダム整数(2, 6)
(15)| ⎿ 待ち客数 = 待ち客数 - 1
(16)| もし 待ち客数 > 0 ならば:
(17)| ⎿ 総待ち時間 = 総待ち時間 + 待ち客数
(18)⎿ 現在時刻 = 現在時刻 + 1
(19)表示する("本日の来客者数:", 顧客数)
(20)表示する("平均待ち時間", 総待ち時間 / 顧客数)
( ア )
1.待ち客数 > 0
2.利用時間 == 0
3.待ち客数 > 0 and 利用時間 == 0
4.待ち客数 > 0 or 利用時間 == 0
答えと解説を見る
答え3.待ち客数 > 0 and 利用時間 == 0
解説待ち行列に客がいて、かつATMが空いているときに次の客の処理を開始します。
平均待ち時間は、待ち時間の合計を客数で割って求めます。