Skip to content

Instantly share code, notes, and snippets.

@kimoto
Created January 15, 2013 06:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kimoto/4536626 to your computer and use it in GitHub Desktop.
Save kimoto/4536626 to your computer and use it in GitHub Desktop.
2つのサイコロの出目の和について、標準偏差(sigma)が全体の68%ぐらいであるかどうかの検証コード
#!/bin/env ruby
# encoding: utf-8
# Author: kimoto
class Array
def sum
self.inject(0){|total,i|
total += i
}
end
def avg
self.sum / self.size
end
def sigma
avg = self.avg
diff = self.map{ |i|
(i - avg) ** 2
}
Math.sqrt(diff.sum / diff.size)
end
end
def dice
[1,2,3,4,5,6].sample
end
puts "rand() + rand() test"
r = []
n = 1000
d = {}
n.times{
n = dice + dice
r << n
d[n] ||= 0
d[n] += 1
}
d.keys.sort.each{ |k|
puts "#{k} => #{d[k]}"
}
# 平均値の算出
p r.avg
# => 7
# 標準偏差が判明(だいたい2.4ぐらい)
p r.sigma
# => 2.23606797749979
total = 0
d.each{ |k,v| total += v }
# 標準偏差の1x範囲に68%が収まるかどうかの確認
min = r.avg - r.sigma.to_i
max = r.avg + r.sigma.to_i
puts "sigma1: #{min} <= #{max}"
sum = 0
(min .. max).each{ |i|
sum += d[i] if d.has_key?(i)
}
p sum.to_f / total.to_f
# => 0.634 (だいたいあってる)
# 標準偏差の2x範囲に95%が収まるかどうかの確認
min = r.avg - (r.sigma.to_i * 2)
max = r.avg + (r.sigma.to_i * 2)
puts "sigma2: #{min} <= #{max}"
sum = 0
(min .. max).each{ |i|
sum += d[i] if d.has_key?(i)
}
p sum.to_f / total.to_f
# => 0.917 (だいたいあってる)
# 標準偏差の3x範囲に99%がおさまるかどうかの確認
min = r.avg - (r.sigma.to_i * 3)
max = r.avg + (r.sigma.to_i * 3)
puts "sigma3: #{min} <= #{max}"
sum = 0
(min .. max).each{ |i|
sum += d[i] if d.has_key?(i)
}
p sum.to_f / total.to_f
# => 1 (だいたいあってるけどちゃんとしてるかな)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment