昼休みのコンビニ
昼休みに、コンビニへ行きました。レジの前に、人が並んでいます。
店長は考えています。「レジを増やすべきかな。」
実験で、レジを増やすのは大変です。そこで、プログラムの中に、小さなコンビニを作ります。
今日のキーワード
| ことば | いみ | れい |
|---|---|---|
| 行列 | 順番を待って、並んでいる人の列です。 | レジの列 |
| 到着 | お客さんが、店に来ることです。 | 1分に1人来る |
| 会計の時間 | 1人のお客さんの会計が、終わるまでの分です。 | 2分 |
| 待ち人数 | 並んで待っている人の数です。会計中の人は入れません。 | 3人 |
| 条件をそろえる | 比べるとき、ほかの決めごとを同じにすることです。 | 同じ到着で比べる |
学生が入力するセルは、このプレビューでは空白です。
小さなコンビニのルール
まず、モデルのルールを決めます。
時間は1分ずつ進みます。1分に、お客さんは0人か1人来ます。レジは1台です。
1人の会計は、いつも同じ時間がかかります。買う量の差や、並ぶのをやめる人は、省きます。
小さな確認: ルールを読む
やってみよう
小さな確認: ルールを読む
3問挑戦してみましょう。回答はここで採点され、その後は保存されません。点数を残したい場合や、続きから再開したい場合はログインしてください。ログインして点数を保存
答えはここで採点され、保存されません。アカウントがあれば、結果が残ります。
例: 8分間の動き(会計は2分)
| 何分め | お客さんが来た? | 待ち人数 | レジ |
|---|---|---|---|
| 1分め | 来た(1) | 0人 | 会計中 |
| 2分め | 来た(1) | 1人 | 会計中 |
| 3分め | 来ない(0) | 0人 | 会計中 |
| 4分め | 来た(1) | 1人 | 会計中 |
| 5分め | 来ない(0) | 0人 | 会計中 |
| 6分め | 来ない(0) | 0人 | 会計中 |
| 7分め | 来ない(0) | 0人 | 空き |
| 8分め | 来た(1) | 0人 | 会計中 |
学生が入力するセルは、このプレビューでは空白です。
1分ごとにすること
1分ごとに、次の四つを、この順番で行います。
一つ目は、お客さんが来たら、待ち人数を1人増やすことです。
二つ目は、レジが空いていて待つ人がいれば、会計を始めることです。このとき待ち人数は1人減ります。
三つ目は、一番長い列の記録を更新することです。四つ目は、会計の残りを1分減らすことです。
やってみよう: 会計が2分と3分
def longest_line(arrivals, service):
waiting = 0 # 並んで待っている人
busy = 0 # いまの会計の、残りの分
longest = 0 # いちばん長かった列
for arrived in arrivals:
if arrived == 1:
waiting = waiting + 1
if busy == 0 and waiting > 0:
waiting = waiting - 1
busy = service
if waiting > longest:
longest = waiting
if busy > 0:
busy = busy - 1
return longest
# 10分間の、お客さんの到着です。同じ到着で比べます。
arrivals = [1, 1, 0, 1, 1, 0, 1, 0, 0, 1]
print("会計2分:", longest_line(arrivals, 2), "人")
print("会計3分:", longest_line(arrivals, 3), "人")
条件をそろえて比べる
重要
会計の時間を比べるときは、お客さんの到着を同じにします。到着までちがうと、何のちがいか分かりません。ここでは、同じ到着のリストを、二回使っています。
やってみよう: 100日分を比べる
import random
def longest_line(arrivals, service):
waiting = 0
busy = 0
longest = 0
for arrived in arrivals:
if arrived == 1:
waiting = waiting + 1
if busy == 0 and waiting > 0:
waiting = waiting - 1
busy = service
if waiting > longest:
longest = waiting
if busy > 0:
busy = busy - 1
return longest
total2 = 0
total3 = 0
for day in range(100):
arrivals = []
for m in range(60):
if random.randint(1, 100) <= 40: # 40%の確率で来ます
arrivals.append(1)
else:
arrivals.append(0)
total2 = total2 + longest_line(arrivals, 2)
total3 = total3 + longest_line(arrivals, 3)
print("最長の列の平均 会計2分:", total2 / 100, "人 会計3分:", total3 / 100, "人")