質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

869閲覧

映画のチケットを買う待ち行列をPythonで表現したい

yoko_

総合スコア14

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/08/19 08:41

「独学プログラマー」P.255に載っているコードです
キューを使って、映画のチケットを買う待ち行列を表現しています。

python

1import time 2import random 3 4class Queue: 5 def __init__(self): 6 self.items = [] 7 8 def is_empty(self): 9 return self.items ==[] 10 11 def enqueue(self, item): 12 self.items.insert(0, item) 13 14 def dequeue(self): 15 return self.items.pop() 16 17 def size(self): 18 return len(self.items) 19 20def simulate_line(till_show, max_time): 21 pq = Queue() 22 tix_sold = [] 23 24 for i in range(100): 25 pq.enqueue("person" + str(i)) 26 27 t_end = time.time() + till_show 28 now =time.time() 29 while now > t_end and not pq.is_empty(): 30 now = time.time() 31 r = random.randint(0, max_time) 32 time.sleep(r) 33 person = pq.dequeue() 34 print(person) 35 tix_sold.append(person) 36 return tix_sold 37 38sold = simulate_line(5, 1) 39print(sold)

これを実行してみたのですが、得られた結果が以下のように空になってしまいます。

[]

本を見ると、

person0

・・・

["person0", "person1", "person2"]

以上のように、シュミレーションされた結果が返ってくるとはずなのですが、
一体どうしてなのでしょうか?
よろしくお願いします。
(ちなみに、引数を変えてみても結果は同じでした。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

解決方法

  • while 文の不等号が逆です。正しくは以下になると思います。
while now < t_end and not pq.is_empty():

考え方

  • エラーメッセージが表示されず、かつ、動作がおかしい場合、条件式を疑うと良いと思います。

私が問題を調査した過程

  • ソースコードを読んで見ました。また、自分の環境で実行してみました。
  • while 文の中に print(person) があるにもかかわらず、何も出力されていませんでした。
  • while 文の条件を読み直してみました。 now > t_end が怪しいと思いました。
  • 変数に何が入るか確認するため、コードを再度読みなおしました。
  • 下記コードが気になりました。
t_end = time.time() + till_show now =time.time()
  • 上記コードを読むと、t_endnow を比較すると、必ず t_end のほうが大きいとわかりました。
  • よって、while 文の中の now < t_end は必ず False となるはずです。
  • while 文の中の不等号 <> に置き換えて実行してみました。
  • 動作が正常であることが確認できました。

投稿2018/08/19 09:21

sutonea

総合スコア207

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

while now > t_end

じゃなくて

while now < t_end

じゃないですかね。

投稿2018/08/19 09:12

tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

while now > t_end and not pq.is_empty():
とすれば、 while の本体が実行され、
['person0', 'person1', 'person2', 'person3', 'person4', 'person5', 'person6', 'person7', 'person8', 'person9']
が返ってきました。

このプログラムが待ち行列の表現になっているかは確認してません。

参考情報

  • 待ち行列について

https://qiita.com/SaitoTsutomu/items/f67c7e9f98dd27d94608

  • PythonデバッグTips

https://qiita.com/TakesxiSximada/items/45b6d71a44f2706798ed

投稿2018/08/19 09:13

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問