喫煙者の1日を観察する

By Kousuke Takeuchi on 09 November 2013 | Comments (0)

私は毎日1箱タバコを吸う、世間から嫌われし喫煙者なのですが、 年間のタバコのコストなどを計算してみようと思いました。

だいたい1箱440円で1日間吸うのだから、普通に考えて440×365円で計算できるのですが、 これはただのフェルミ推定を行っているだけでツマラナイです。

なので、Rubyを使って1時間ほどかけて喫煙者の一日をシミュレーションするプログラムを作成しましたw 簡単な喫煙者モデルと、喫煙者の一日のモデルを作成してシミュレートしただけなので、細かい説明は省きます。

#喫煙者クラス
class Smoker
        attr :smoking_time #累計喫煙時間
        attr :tobacco #現在所持しているタバコの本数
        attr :tobacco_total #今まで吸ったタバコの本数
        attr :cost #タバコにかけた金額の合計
        attr :interval_average #次のタバコを吸うまでの平均時間(分)
        attr :interval #のタバコを吸うまでの時間(分)

        def initialize(average)
                @smoking_time = 0
                @tobacco = 0
                @tobacco_total = 0
                @cost = 0
                @interval_average = average
        end

        #我慢できないのでタバコを吸う
        def smoke
                #次にタバコを吸うまでの時間(分)
                @interval = 60 * (Random.rand(60) + 1) / @interval_average
                charge_tobacco() unless @tobacco > 0
                @tobacco -= 1
                @smoking_time += 10 #10分間喫煙タイム
                @tobacco_total += 1 #また彼の体内に有害なニコチン・タールが注入されてしまった
        end

        #タバコが無くなったので買いに行く
        def charge_tobacco
                @cost += 440
                @tobacco += 20
        end
end

#喫煙者の1日
class SmokersOneDay
        attr :smoker #喫煙者
        attr :rest_time #喫煙者の1日の残り時間

        def initialize(smoker, rest)
                @smoker = smoker
                @rest_time = rest
        end

        #喫煙者の1日を進める
        def tick
                @rest_time = (@rest_time > @smoker.interval) ? (@rest_time - @smoker.interval) : 0
                @smoker.smoke
                @rest_time = (@rest_time > 10) ? (@rest_time - 10) : 0
        end
end

#時間変換
def to_hour(time)
        return 8 + time/60
end
def to_minute(time)
        return time % 60
end

#喫煙者を作成する
smoker = Smoker.new(45)

#あなたの一日を観察させてほしいとお願いした
#その依頼中に彼は1本タバコを吸っていた
smoker.smoke

#彼から承諾を得たのでレポート用紙を用意する
f = open("smoker_report.txt", "w")

#彼の1年後を楽しみに待つとしよう
365.times do |n|
        #喫煙者の一日が始まる
        one_day = SmokersOneDay.new(smoker, 15*60)

        #早送りで喫煙者の一日をご覧いただこう
        f.write("#{n+1}日目...\n")
        while one_day.rest_time > 0
                one_day.tick
                #観察調査をレポートにまとめる
                now_time = 15*60 - one_day.rest_time #現在の時刻
                hour = to_hour(now_time)
                minute = to_minute(now_time)
                report = "#{hour}:#{minute}, #{smoker.tobacco_total}\n"
                f.write(report)
        end
end

#さて、彼は1年間でいくらのタバコ代を浪費したのだろう?
p "年間のタバコ代"
p smoker.cost
p "年間喫煙時間"
p smoker.smoking_time / 60
p "年間タール摂取量"
p smoker.tobacco * 8

#最後にレポート用紙を上司に提出する
f.close

#これにて喫煙者の調査を終了する

レポートの内容がこちら(一部抜き出し)

21:8, 36
21:42, 37
23:0, 38
3日目...
9:18, 39
10:12, 40
10:50, 41
12:14, 42
13:28, 43
14:43, 44
16:7, 45
16:50, 46
17:14, 47
18:6, 48
19:6, 49
19:26, 50
20:29, 51
21:19, 52
22:31, 53
23:0, 54
4日目...
8:54, 55
9:34, 56

Rubyって話し言葉みたいなんだから、物語チックにコメントを書いてみようと思ったので、 プログラム中のコメントをふざけさせて頂きましたw

実行結果した結果、1年間のタバコ代は148720円とのことでした(ランダムシミュレーションなので、実行ごとに多少の誤差は発生します) これは最初に計算した、440×365=160600円とかなり近い計算になります。

ただしフェルミ推定の方は、かなりアバウトな計算になるのでシミュレーション結果の方の金額が現実的であると思います。

今回のシミュレーションでわかったことは、普通にタバコを吸ってるだけで 年間iMacを1台買い換えれるくらいのお金をドブに捨ててるわけですね。

ただ一番びっくりしたのが、1年間の内タバコを吸ってる時間が1000時間を超えること。 つまり、1年間のうち1ヶ月以上を喫煙時間で消費してしまってるのですね。 タバコを吸ってると他のオフィスの人とコミュニケーションが取れるから、営業で案件を取ってくる際にやりやすいと思ってたのですが、えらくコストの掛かるコミュニケーションだなって思いましたw

以上。


Generated by Jekyll and served out of Github Pages