喫煙者の1日を観察する
私は毎日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
以上。