import math
import random
import matplotlib.pyplot as plt
time_c = 5.0 # 次の客(customer)が来るまでの平均時間(分)
time_s = 1.0 # 平均的なレジのサービス時間(service)(分)
t = 0
tc = 0
n = 0
t_all=[ ] # 行列の人数が変化する時刻
n_all=[ ] # 行列の人数
while t < 240: # 240分(4時間)のシミュレーション
n_prev = n
if n == 0: # もしレジの客が0人なら
x = -time_c * math.log(1-random.random()) # 次の客が来るまでの時間
t = tc
tc = tc + x # 客が来る時刻tc は x分だけ進んだ時刻
n = 1 # x分経過し,次の客が来て,レジに1人いる状態になる
e = -time_s * math.log(1-random.random()) # サービスにかかる時間
ts = t + e # レジが終わる時刻 ts
else: # レジに既に人がいるとき
if tc < ts: # 次に客が来る時間が,レジより短ければ
n = n + 1 # 待ち客が1人増える
x = -time_c * math.log(1-random.random())
t = tc
tc = tc + x
elif tc == ts: # 前の客が終わったと同時に次の客が来る場合
# 行列の人数は変わらず,次の客が来る時間を計算
x = -time_c * math.log(1-random.random())
t = tc
tc = tc + x
elif tc > ts: # 次の客が来る前にレジが終われば,1人減る
n = n - 1
e = -time_s * math.log(1-random.random())
t = ts
ts = ts + e
t_all.append(t)
n_all.append(n_prev)
t_all.append(t)
n_all.append(n)
plt.plot(t_all,n_all, color="red", linewidth=1.0)
plt.xlabel('Time (min)')
plt.ylabel('Waiting People')
plt.grid(True)
plt.show()