喫煙者の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

以上。