『コレクション完成』(模擬実験、その三) [Ruby]
別記事〔『コレクション完成』(模擬実験、その二〕で、Rubyによる数値計算により、10000人分の模擬実験を行うプログラムを紹介しました。
しかし、数値を数字で表示しただけでは、せっかくの度数データもどういう分布になっているのか直感的な理解ができません。
そこで簡易的なヒストグラムを表示するプログラムをRubyで書いてみましたので紹介いたします。
(by 心如)
───〔出力例〕───────────────────────────
10000人のサンプル分布〔個数:人数〕
(最多:140個、最少:12個、平均37.0142個)
140: 1|
132: 1|
122: 1|
121: 2|
110: 2|
109: 3|
107: 1|
103: 1|
102: 1|
101: 2|
100: 1|
99: 2|
98: 3|
97: 1|
96: 3|
95: 2|
94: 2|
93: 1|
92: 3|
91: 4|#
90: 2|
89: 4|#
88: 10|##
87: 4|#
86: 6|#
85: 6|#
84: 6|#
83: 6|#
82: 14|##
81: 12|##
80: 10|##
79: 6|#
78: 9|#
77: 17|###
76: 10|##
75: 10|##
74: 16|##
73: 24|####
72: 23|###
71: 27|####
70: 28|####
69: 19|###
68: 28|####
67: 30|#####
66: 45|#######
65: 41|######
64: 38|######
63: 49|#######
62: 51|########
61: 47|#######
60: 46|#######
59: 63|#########
58: 69|##########
57: 76|###########
56: 69|##########
55: 80|############
54: 98|###############
53: 86|#############
52: 94|##############
51:103|###############
50:128|###################
49:133|####################
48:153|#######################
47:154|#######################
46:172|##########################
45:191|#############################
44:192|#############################
43:225|##################################
42:207|###############################
41:214|################################
40:281|##########################################
39:265|########################################
38:283|##########################################
37:284|###########################################
36:329|#################################################
35:331|##################################################
34:348|####################################################
33:352|#####################################################
32:361|######################################################
31:379|#########################################################
30:340|###################################################
29:329|#################################################
28:348|####################################################
27:355|#####################################################
26:360|######################################################
25:309|##############################################
24:300|#############################################
23:252|######################################
22:230|###################################
21:229|##################################
20:174|##########################
19:143|#####################
18: 85|#############
17: 76|###########
16: 39|######
15: 17|###
14: 9|#
13: 3|
12: 1|
* 平均の37個以下は5983人、74個以上は185人でした
───〔プログラム例〕───────────────────────────
#! ruby -Ks
#
# 2012.04.14 ───── coded by 心如
st = Time.now # 時刻の取得
srand(st.sec ^ st.usec ^ Process.pid) # 乱数の初期化
Omake_max = 12 # おまけの種類数
Kai = 10000 # 試算する人数
sc = 0 # 購入総数
bnp = Hash.new(0) # 購入個数分布の初期化
max_cnt, min_cnt = 0, 200
(1..Kai).each do |n|
omake = []
cnt = 0
until (omake.uniq).size == Omake_max do
omake << rand(Omake_max) + 1
cnt += 1
end
sc += cnt
bnp[cnt] += 1
max_cnt = cnt if cnt > max_cnt
min_cnt = cnt if cnt < min_cnt
if $DEBUG
printf("%5d人目:%3d個(総数:%5d個)、平均:%6.3f個\n",
n, cnt, sc, sc.to_f / n)
end
end
puts "#{Kai}人のサンプル分布〔個数:人数〕"
puts "(最多:#{max_cnt}個、最少:#{min_cnt}個、平均#{sc.to_f / Kai}個)"
avrg = (0.5 + sc.to_f / Kai).to_i
u_avrg = 0
o_2avr = 0
bnp.sort{|a,b|
b[0] <=> a[0]
}.each{|key,v|
printf("%3d:%3d|%-s\n",key, v, "#"*(v * 0.15 + 0.5))
u_avrg += v if key <= avrg
o_2avr += v if key >= avrg * 2
}
puts "\n* 平均の#{avrg}個以下は#{u_avrg}人、#{avrg * 2}個以上は#{o_2avr}人でした"
コメント 0