Easier to read with cream paper, a tint, more contrast or larger text? Choose your colours and text, once, for every page.

プレビュー

行列のシミュレーション

これはレッスンの最初のページです。読んで、アクティビティを試してみましょう。続きは授業の全体にあります。

40分

昼休みのコンビニ

昼休みに、コンビニへ行きました。レジの前に、人が並んでいます。

店長は考えています。「レジを増やすべきかな。」

実験で、レジを増やすのは大変です。そこで、プログラムの中に、小さなコンビニを作ります。

今日のキーワード

ことばいみれい
行列順番を待って、並んでいる人の列です。レジの列
到着お客さんが、店に来ることです。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分

コード: python
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日分を比べる

コード: python
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, "人")

レッスンはまだ続きます

このレッスンの残り5つの部分は、練習問題や最後の確認とともに、授業の全体にあります。アカウントがあれば、すべて使えます。