4節 シミュレーション
[第5章 問題解決とその方法] 
複利法による預金額(確定的モデル)
授業 第5回
【課題】
銀行に100,000円を預けた。利率が年5%の複利であるとき,10年後までの毎年の預金残高を表示したい。
※複利とは,利子が利子を生む仕組みのこと。
 利子を受け取り,利子に利子がつかない仕組みは単利という。

【考察】
数式モデル
[利子]=[元金 or 前年の預金額]×[利率]
[初年度預金顎]=[元金]+[初年度の利子]
[以降の預金額]=[前年の預金額]+[前年度の利子]
 変数一覧
元 金
預金額
利 率
利 子
経過年
:gankin
:yokin
:riritsu
:rishi
:nen
【DNCL】
gankin = 100000
riritsu = 0.05
yokin = gankin
nen を 0 から 10 まで 1 ずつ増やしながら繰り返す:
│   rishi = yokin * riritsu
│   表示する(nen,"年目:預金額",yokin,"円:利子",rishi,"円")
⎿   yokin = yokin + rishi
 ⇨ IDEで動作確認 
 
gankin   rishi   gankin*rishi
gankin*riritsu   yokin*riritsu   rishi*riritsu
gankin+rishi   yokin+rishi   gankin+yokin
×
[通常版]
gankin = 100000 riritsu = 0.05 yokin = gankin for nen in range(11): rishi = yokin * riritsu print(nen,"年目:預金額",yokin,"円:利子",rishi,"円") yokin = yokin + rishi
[研究:グラフ表示版] ※授業で用いたmonacaでは動作しません。
import matplotlib.pyplot as plt gankin = 100000 riritsu = 0.05 yokin = gankin x = [0] y = [yokin] for nen in range(11): rishi = yokin * riritsu print(nen,"年目:預金額",yokin,"円:利子",rishi,"円") yokin = yokin + rishi x.append(nen+1) y.append(yokin) plt.plot(x,y) plt.show()
放水による貯水池の水量(確定的モデル)
授業 第6回 ※未実施
【課題】
最大貯水量15000㎥ の本北方貯水池は次のように管理されている。
毎日,残りの貯水量に対して15%の割合に当たる量を放水する。
残りの貯水量が最大貯水量の20%以下となったとき放水を停止する。
さて,最初の貯水量が12000m³であるとき,今後30日間の貯水量が
どうなるか調べてみよう。

【考察】
数式モデル
[放水量]=[貯水量]×[放水割合]
[仮貯水量]=[前日の貯水量]ー[前日の放水量]
  ※放水停止量を下回った時点で放水は停止するが,停止しないものとして仮に算出しておく。
[貯水量]=[仮貯水量]と[放水停止量]の大きい方
  ※仮貯水量が放水停止量より多いときは仮貯水量,少ないときは放水停止量となる。
変数一覧
貯水量
最大貯水量
最初の貯水量
仮貯水量
放水量
放水割合
放水停止量
放水停止割合
経過日数
最大経過日数
:chosui
:chosuimax
:chosuistart
:chosuikari
:hosui
:hosuiwariai
:hosuiteishi
:hosuiteishiwariai
:day
:daymax
※日々変動する貯水量 


※貯水量が放水停止量より少なくなっても
 放水を停止せず,そのまま続けたときに
 到達すると考えられる計算上の貯水量

※放水を停止するときの貯水量

※初日は「0」とする
※ここでは「30」である
  アルゴリズムの工夫
 放水量は,その時点での貯水量(前日の貯水量)から算出している。
 ところが,放水中に貯水量が放水停止量を下回ったならば,本来はその時点で放水を停止しなくてはならない。従ってその日の放水量は先に計算をした放水量より少なくなる。
 これを実現するため,放水停止量を下回っても気にせず,そのまま計算した仮貯水量という仮想的な数量を導入する。そしてもしその値が放水停止量以上ならば,そのまま仮貯水量を貯水量とし,放水量も計算どおりとする。逆にもし下回るようならば,貯水量は放水停止量とし,放水量は元の貯水量と放水停止量の差として求めることにした。
【DNCL】
chosuimax = 15000
chosuistart = 12000
hosuiwariai = 0.15
hosuiteishiwariai = 0.20
daymax = 30

hosuiteishi = chosuimax * hosuiteishiwariai
chosui = chosuistart

day を 0 から daymax まで 1 ずつ増やしながら繰り返す:
│   hosui = chosui * hosuiwariai
│   chosuikari = chosui - hosui
│   もし chosuikari < hosuiteishi ならば:
│   ⎿   hosui = chosui - hosuiteishi
│   表示する(day,"日:貯水量",chosui,":放水量",hosui)
⎿   chosui = chosui - hosui
 ⇨ IDEで動作確認 
 
chosuimax*hosuiteishiwariai chosuisart*hosuiwariai chosuistart*hosuiteishiwariai chosui*hosuiwariai chosui+hosui chosui-hosui chosuikari-housui chosui+hosuiteishi chosui-hosuiteishi
×
[通常版]
chosuimax = 15000 chosuistart = 12000 hosuiwariai = 0.15 hosuiteishiwariai = 0.20 daymax = 30 hosuiteishi = chosuimax * hosuiteishiwariai chosui = chosuistart for day in range(0,daymax+1): hosui = chosui * hosuiwariai chosuikari = chosui - hosui if chosuikari < hosuiteishi: hosui = chosui - hosuiteishi print(day,"日:貯水量",chosui,":放水量",hosui) chosui = chosui - hosui
[研究:グラフ表示版] ※授業で用いたmonacaでは動作しません。
import matplotlib.pyplot as plt chosuimax = 15000 chosuistart = 12000 hosuiwariai = 0.15 hosuiteishiwariai = 0.20 daymax = 30 x_day = [] y_chosui = [] y_hosui = [] hosuiteishi = chosuimax * hosuiteishiwariai chosui = chosuistart for day in range(0,daymax+1): hosui = chosui * hosuiwariai chosuikari = chosui - hosui if chosuikari < hosuiteishi: hosui = chosui - hosuiteishi print(day,"日:貯水量",chosui,":放水量",hosui) x_day.append(day) y_chosui.append(chosui) y_hosui.append(hosui) chosui = chosui - hosui plt.plot(x_day,y_chosui) plt.plot(x_day,y_hosui) plt.show()
焼きそば店のおつり(確率的モデル)
授業 第7回
【課題】
一人一皿限定の200円,現金扱いのみの焼きそば店を開くことにした。
お客は料金を100円玉で支払うか,500円玉で支払いお釣りを100円玉で受け取るかのいずれかである。これまでの記録から,お客が100円玉で支払う確率は70%であることが分かっている。
全部で100皿を販売する計画を立てた。開店前にお釣り用の100円硬貨を何枚用意すればよいか,望ましい枚数を提案して欲しい。

【考察】
アルゴリズムの要点
・それぞれのお客が100円硬貨で支払うか500円硬貨で支払うかは,
 コンピュータで発生した 0 以上 1 未満の乱数の値により決める。
・支払いが100円硬貨のときは,100円硬貨が2枚増加する。また支払いが
 500円硬貨のときは,500円硬貨が1枚増加し,100円硬貨が3枚減少する。
・100円硬貨の最小枚数は,毎回支払いが終わった時点で,そのときの枚数と
 その前までの最小枚数とを比較し,より小さい方を以降の最小枚数とする。
変数一覧
販売総数
支払い硬貨の決定確率
100円硬貨の枚数
500円硬貨の枚数
100円硬貨の最小枚数
お客の番号(1~sosu)
:sosu
:kakuritsu
:coin100
:coin500
:min100
:kyaku
関数の説明
乱数() ・・・ 0 以上 1 未満のランダムな小数を返す。
例えば,x = 乱数() のとき x に 0.57309 など無作為な小数が代入される。
【DNCL】
sosu = 100
kakuritsu = 0.7
coin100 = 0
coin500 = 0

min100 = 300
kyaku を 1 から sosu まで 1 ずつ増やしながら繰り返す:
│   もし 乱数() < kakuritsu ならば:
│   │   coin100 = coin100 + 2
│   そうでなければ:
│   │   coin500 = coin500 + 1
│   │   coin100 = coin100 - 3
│   │   もし coin100 < min100 ならば:
│   ⎿   ⎿   min100 = coin100
⎿   表示する("客",kyaku,":100円",coin100,":500円",coin500)

表示する("100円硬貨 最小枚数:",min100)
 ⇨ IDEで動作確認 
 
coin100-1  coin100-3  coin100+2  coin100+1
coin500-1  coin500-3  coin500+2  coin500+1
coin100=min100  min100=coin100+coin500
min100=coin100  min100=coin100-coin500
×
【研究:配列を用いたDNCL】
すべてのお客について,支払い後の100円硬貨の枚数と500円硬貨の枚数を配列変数に代入していく手法でコーディングしてみよう。あるお客の支払後の各硬貨の枚数は,その前のお客の支払後の各硬貨の枚数を増減させたものになる。100円硬貨の枚数の最小値は,その最小値を与えるお客の番号を記録しておくこととする。
変数一覧
販売総数
支払い硬貨の決定確率
100円硬貨の枚数
500円硬貨の枚数
お客の番号(1~sosu)
枚数最小のお客番号
:sosu
:kakuritsu
:配列 Coin100
:配列 Coin500
:kyaku
:minkyaku
Coin100[0],Coin500[0]
:初期値(開店前の硬貨枚数)
Coin100[n],Coin500[n]
:n番目のお客の後の硬貨枚数
minkyaku:100円硬貨の
 枚数を最小にするお客の番号
sosu = 100
kakuritsu = 0.7
Coin100 の全ての値を0にする
Coin500 の全ての値を0にする

minkyaku = 0
Coin100[minkyaku] = 0     #開店前に準備した100円硬貨の枚数
kyaku を 1 から sosu まで 1 ずつ増やしながら繰り返す:
│   もし 乱数() < kakuritsu ならば:
│   │   Coin100[kyaku] = Coin100[kyaku - 1] + 2
│   │   Coin500[kyaku] = Coin500[kyaku - 1]
│   そうでなければ:
│   │   Coin100[kyaku] = Coin100[kyaku - 1] - 3
│   │   Coin500[kyaku] = Coin500[kyaku - 1] + 1
│   │   もし Coin100[kyaku] < Coin100[minkyaku] ならば:
│   ⎿   ⎿   minkyaku = kyaku
│   表示する("客",kyaku,":100円硬貨",Coin100[kyaku],
⎿              ":500円硬貨",Coin500[kyaku])
表示する("100円硬貨 最小枚数:",Coin100[minkyaku])
 
Coin100[kyaku-1]
Coin100[kyaku-1]+2
Coin100[kyaku+1]+1
Coin100[kyaku-1]-3
minkyaku=kyaku
Coin100[kyaku]
Coin500[kyaku-1]
Coin500[kyaku+1]-1
Coin500[kyaku-1]+2
Coin500[kyaku-1]+1
kyaku=minkyaku
Coin100[minkyaku]
×
[通常版]
import random sosu = 100 kakuritsu = 0.7 coin100 = 0 coin500 = 0 coin100min = 300 for kyaku in range(1,sosu+1): if random.random() < kakuritsu: coin100 = coin100 + 2 else: coin500 = coin500 + 1 coin100 = coin100 - 3 if coin100 < coin100min: coin100min = coin100 print("客",kyaku,":100円硬貨",coin100,":500円硬貨",coin500) print("100円硬貨 最小枚数:",coin100min)
[研究:グラフ表示版] ※授業で用いたmonacaでは動作しません。
import random import matplotlib.pyplot as plt sosu = 100 kakuritsu = 0.7 coin100 = 0 coin500 = 0 Kyaku = [] Coin100 = [] Coin500 = [] coin100min = 300 for kyaku in range(1,sosu+1): if random.random() < kakuritsu: coin100 = coin100 + 2 else: coin500 = coin500 + 1 coin100 = coin100 - 3 if coin100 < coin100min: coin100min = coin100 print("客",kyaku,":100円硬貨",coin100,":500円硬貨",coin500) Kyaku.append(kyaku) Coin100.append(coin100) Coin500.append(coin500) print("100円硬貨 最小枚数:",coin100min) plt.plot(Kyaku,Coin100) plt.plot(Kyaku,Coin500) plt.show()
モンテカルロ法による円周率の算出(確率的モデル)
授業 第8回
【課題】
モンテカルロ法を用いて円周率を求めよう。試行を繰り返す回数を
増やすことで円周率の近似値がどのように変化するかも調べてみよう。

【考察】
数式モデル
 [四分円の面積]:[正方形の面積]=π/4:1
多数の点を任意にとったとすると,左辺の比は,
それぞれの図形内の点の数の比に等しくなる。
 [四分円内の点の数]:[正方形内の点の数]=π/4:1
∴ π=4×[四分円内の点の数]/[正方形内の点の数]
この関係からπの近似値を得ることができる。
変数一覧
正方形内の点の数
四分円内の点の数
点の座標
点の原点からの距離
円周率の近似値
:point
:inside
:x,y
:distance
:pai
[DNCLの演算子について]
・加減乗除の四則演算 「+」 「-」 「*」 「/」
・整数の乗除  商(整数)「÷」  余り「%」
例:
11÷4*4 →  8
12÷4*4 → 12
13÷4*4 → 12
14÷4*4 → 12
15÷4*4 → 12
16÷4*4 → 16
・べき乗 「**」  例:5**2(=52
【DNCL】
inside = 0
point を 1 から 1000 まで 1 ずつ増やしながら繰り返す:
│   x = 乱数()
│   y = 乱数()
│   distance = x * x + y * y
│   もし distance <= 1 ならば:  #点が四分円内にあるとき実行
│   ⎿   inside = inside + 1
│   もし point == point ÷ 100 * 100 ならば:  #point の 100 とびに実行
│   │   pai = 4 * inside / point
⎿   ⎿   表示する("点の総数",point,":円周率の近似値",pai)
 ⇨ IDEで動作確認 
 
x<1 and y<1  x+y<=1  distance<=1  distance==1
inside-1  inside+1  poin+inside  point-inside
point/100==inside/100  point==point÷100*100
point÷100==inside÷100  point==point%100*100
4*inside/point  4/inside*point  4*inside*point
×
[通常版]
import random inside = 0 for point in range(1,1001): x = random.random() y = random.random() distance = x * x + y * y if distance <= 1: #点が四分円内にあるとき実行 inside = inside + 1 if point == point//100*100: #point の 100 とびに実行 pai = 4 * inside / point print("点の総数",point,":円周率の近似値",pai)
[研究:グラフ表示版] ※授業で用いたmonacaでは動作しません。
import random import matplotlib.pyplot as plt x_out = [] ; y_out = [] x_in = [] ; y_in = [] x_pai = [] ; y_pai = [] inside = 0 for point in range(1,1001): x = random.random() y = random.random() distance = x * x + y * y if distance <= 1: #点が四分円内にあるとき実行 inside = inside + 1 x_in.append(x) y_in.append(y) else: x_out.append(x) y_out.append(y) if point == point//100*100: #point の 100 とびに実行 pai = 4 * inside / point print("点の総数",point,":円周率の近似値",pai) x_pai.append(point) y_pai.append(pai) plt.scatter(x_in, y_in, color="red") plt.scatter(x_out, y_out, color="blue") plt.show() plt.plot(x_pai,y_pai) plt.show()
ATMでの待ち行列(確率的モデル)
授業 第9回
【課題】
銀行にATM(現金自動預払機)が1台設置されている。このATMが使用されているときには,新たに来た客はATMが空くまで列を作って待たなくてはならない。この待ち時間はどのくらいになるのか,また待ち時間を少なくするためにはどのような改善策があるのだろうか。
ただし,前の客が到着してから次の客が到着するまでの到着間隔と,客がATMに対面し操作を始め操作を終了しATMから離れるまでの使用時間は,過去のデータから下の表のようになっていることが分かっている。
到着間隔(分) 人数
11
17
13
 9
使用時間(分) 人数
 7
16
27

【考察】
  プログラムは,到着間隔及び使用時間を求める関数部分と
  待ち行列を処理する Main Routine の2部構成でコーディングする。
【プログラム①】到着間隔及び使用時間を求める関数
算出のアルゴリズム
① 過去のデータから,各階級(時間 : 分)の累積確率を算出しておく。
② 0~1 未満の乱数を発生させる。
③ 乱数の値が累積確率の値を超えない最大の階級(時間 : 分)を求める。
 例)乱数 0.12 ⇒ 1分,乱数 0.16 ⇒ 2分,乱数 0.45 ⇒ 2分,乱数 0.50 ⇒ 3分
変数一覧
※「使用時間」の場合の例
jikan
Dosu
kaikyu
kaikyusu
Kakuritsu
Ruiseki
:時間を求める関数
:各時間の人数(配列変数の引数)
:時間・階級の値
:時間を表す階級の個数
:各時間の人数割合(配列変数)
:各時間の人数累積割合(配列変数)
戻り値は「分」
[7,16,27]
1,2,3 のいずれか
3
[0.14,0.32,0.54]
[0.14,0.46,1]
関数の説明
乱数() ・・・ 0 以上 1 未満のランダムな小数を返す。
例えば,x = 乱数() のとき x に 0.57309 など無作為な小数が代入される。
要素数(配列変数) ・・・ 配列変数の要素の個数を返す。
例えば,Data = [2,4,6] のとき 要素数(Data) の値は 3 である。
プログラムについて
05~07行
08,09行
10~12行
13~18行
:配列変数 各時間の人数 Dosu の合計を求める。
:配列変数 各時間の人数割合(確率)Kakuritsu を求める。
:配列変数 各時間の人数累積割合(累積確率)Ruiseki を求める。
:乱数を発生させ,それが人数累積割合を超えない最大の使用時間
 を求め,関数の戻り値とする。
【DNCL】時間を求める関数部分 ※配列の添え字は1より始まるものとする。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
関数 jikan(Dosu):
│   kaikyusu = 要素数(Dosu)
│   Kakuritsu の全ての値を0にする
│   Ruiseki の全ての値を0にする
│   sum = 0
│   i を 1 から kaikyusu まで 1 ずつ増やしながら繰り返す:
│   ⎿   sum = sum + Dosu[i]
│   i を 1 から kaikyusu まで 1 ずつ増やしながら繰り返す:
│   ⎿   Kakuritsu[i] = Dosu[i] / sum
│   Ruiseki[1] = Kakuritsu[1]
│   i を 2 から kaikyusu まで 1 ずつ増やしながら繰り返す:
│   ⎿   Ruiseki[i]=Ruiseki[i-1]+Kakuritsu[i]
│   r = 乱数()
│   kaikyu = 1
│   True の間繰り返す:
│   │   もし r < Ruiseki[kaikyu] ならば:
│   │   ⎿   kaikyu を返す
⎿   ⎿   kaikyu = kaikyu + 1
 ⇨ IDEで動作確認 ※動作確認の為の追加コードを含む
 
0  1  kaikyu  kaikyu+1  kaikyu-1
1 から kaikyusu まで  2 から kaikyusu まで
sum + i  sum+Dosu[i]  Dosu[i]/sum
Kakuritsu[1]  Kakuritsu[i]  Kakuritsu[i-1]
Kakuritsu[kaikyu]  Ruiseki[1]  Ruiseki[i]
Ruiseki[i-1]  Ruiseki[kaikyu]
Ruiseki[i]+Kakuritsu[i-1]  Ruiseki[i-1]+Kakuritsu[i]
×
【プログラム②】行列のモデル(Main Routine)
数式モデル
・[到着時刻]=[前の客の到着時刻]+[確率的に算出した到着間隔]
・[開始時刻]=[前の客の終了時刻]と[到着時刻]を比較し遅い方の時刻
・[終了時刻]=[開始時刻]+[確率的に算出した使用時間]
・[待ち時間]=[開始時刻]-[到着時刻]
※プログラムでは,それぞれの値を下の行番号で求めている。
客番号 到着間隔 到着時刻 開始時刻 使用時間 終了時刻 待ち時間
13 14 15 16~19 20 21 22
変数一覧
jikan

kyakusu
kyaku
Chakukan
Chakuji
Kaishiji
Shiyoji
Shuryoji
Machiji
Chakubnp
Shiyobnp
:時間を求める関数
 ※引数は各時間の人数分布(配列変数)
:客全部の人数
:客の番号
:到着間隔(配列変数)
:到着時刻(配列変数)
:開始時刻(配列変数)
:使用時間(配列変数)
:終了時刻(配列変数)
:待ち時間(配列変数)
:到着間隔の人数分布(配列変数)
:使用時間の人数分布(配列変数)
【DNCL】Main Routine ※配列の添え字は1より始まるものとする。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
kyakusu = 10
Chakukan の全ての値を0にする
Chakuji の全ての値を0にする
Kaishiji の全ての値を0にする
Shiyoji の全ての値を0にする
Shuryoji の全ての値を0にする
Machiji の全ての値を0にする
Chakubnp = [11, 17, 13, 9]
Shiyobnp = [7, 16, 27]

Shiyoji[1] = jikan(Shiyobnp)
Shuryoji[1] = Shiyoji[1]
kyaku を 2 から kyakusu まで 1 ずつ増やしながら繰り返す:
│   Chakukan[kyaku] = jikan(Chakubnp)
│   Chakuji[kyaku]=Chakuji[kyaku-1]+Chakukan[kyaku]
│   もし Shuryoji[kyaku - 1] > Chakuji[kyaku] ならば:
│   ⎿   Kaishiji[kyaku] = Shuryoji[kyaku - 1]
│   そうでなければ:
│   ⎿   Kaishiji[kyaku] = Chakuji[kyaku]
│   Shiyoji[kyaku] = jikan(Shiyobnp)
│   Shuryoji[kyaku] = Kaishiji[kyaku] + Shiyoji[kyaku]
⎿   Machiji[kyaku] = Kaishiji[kyaku] - Chakuji[kyaku]
kyaku を 1 から kyakusu まで 1 ずつ増やしながら繰り返す:
│   表示する("客",kyaku,":到着間隔",Chakukan[kyaku],
│        ":到着時刻",Chakuji[kyaku],
│        ":開始時刻",Kaishiji[kyaku],
│        ":使用時間",Shiyoji[kyaku],
│        ":終了時刻",Shuryoji[kyaku],
⎿        ":待ち時間",Machiji[kyaku])
 ⇨ IDEで動作確認 ※関数 jikan(Dosu) のコードを含む
関数を用いて一部修正
上のプログラム Main Routine で,開始時刻を求める16~19行目の部分は,
下の関数を用いると一行で記述ができる。このコードを求めなさい。
最大値(x,y) ・・・ 引数として与えられた二つの値の最大値を返す。
例えば,最大値(1,5)は5となり,最大値(2,2)は2となる。
16
17
18
19
│   もし Shuryoji[kyaku - 1] > Chakuji[kyaku] ならば:
│   ⎿   Kaishiji[kyaku] = Shuryoji[kyaku - 1]
│   そうでなければ:
│   ⎿   Kaishiji[kyaku] = Chakuji[kyaku]
Kaishiji[kyaku] = 最大値(Shuryoji[kyaku-1] , Chakuji[kyaku])
 
kyakusu  kyakusu + 1  kyaku  kyaku + 1
Chakukan[kyaku]  Chakukan[kyaku-1]
Chakuji[kyaku]  Chakuji[kyaku-1]
Kaishiji[kyaku]  Kaishiji[kyaku-1]
Shiyoji[kyaku]  Shiyoji[kyaku-1]
Shuryoji[kyaku]  Shuryoji[kyaku-1]
Machiji[kyaku]  Machiji[kyaku-1]
×
[通常版]
# 関数 jikan =========================== def jikan(dosu):     import random     kaikyusu = len(dosu)     kakuritsu = [0] * kaikyusu     ruiseki = [0] * kaikyusu     #度数の合計 -----------------------     sum = 0     for n in dosu:         sum = sum + n     #確率 -----------------------------     for i in range(kaikyusu):         kakuritsu[i] = dosu[i] / sum     #累積確率 -------------------------     ruiseki[0] = kakuritsu[0]     for i in range(1,kaikyusu):         ruiseki[i] = ruiseki[i-1] + kakuritsu[i]     #出現確率に応じた階級の取得 -------     r = random.random()     kaikyu = 0     while True:         if r < ruiseki[kaikyu]:             return kaikyu + 1         kaikyu = kaikyu + 1 # Main Routine ===========================
kyakusu = 10 chakubnp = [11,17,13,9] shiyobnp = [7,16,27] chakukan = [0] * kyakusu chakuji = [0] * kyakusu kaishiji = [0] * kyakusu shiyoji = [0] * kyakusu shuryoji = [0] * kyakusu machiji = [0] * kyakusu
# 客の総数 # 到着間隔の過去の統計 # 使用時間の過去の統計 # 到着間隔 # 到着時刻 # 開始時刻 # 使用時間 # 終了時刻 # 待ち時間
#最初の客の設定 ----------------------- chakuji[0] = 0 kaishiji[0] = 0 shiyoji[0] = jikan(shiyobnp) shuryoji[0] = shiyoji[0] machiji[0] = 0 #2番目以降の客の設定 ----------------- for kyaku in range(1,kyakusu):     chakukan[kyaku] = jikan(chakubnp)     chakuji[kyaku] = chakuji[kyaku-1] + chakukan[kyaku]     if shuryoji[kyaku-1] > chakuji[kyaku]:         kaishiji[kyaku] = shuryoji[kyaku-1]     else:         kaishiji[kyaku] = chakuji[kyaku]     shiyoji[kyaku] = jikan(shiyobnp)     shuryoji[kyaku] = kaishiji[kyaku] + shiyoji[kyaku]     machiji[kyaku] = kaishiji[kyaku] - chakuji[kyaku] #状況の表示 --------------------------- for kyaku in range(kyakusu):     print("客",kyaku,              ":到着間隔",chakukan[kyaku],              ":到着時刻",chakuji[kyaku],              ":開始時刻",kaishiji[kyaku],              ":使用時間",shiyoji[kyaku],              ":終了時刻",shuryoji[kyaku],              ":待ち時間",machiji[kyaku])