SSブログ

『コレクション完成』(模擬実験、その三) [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人でした

my HL.JPG 

───〔プログラム例〕───────────────────────────
#! 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}人でした"


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。