Last active
December 14, 2016 13:28
-
-
Save yiyizym/e7f4cd87253f904ce49ff1d445d3dc58 to your computer and use it in GitHub Desktop.
从 1% 的样本中评估总体的平均值
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
#生成 10_000 个呈正态分布的范围在0-4之间的随机数 | |
#计算他们的平均值 | |
#从中随机抽取100个数 | |
#通过有放回重抽法尝试 10_000 次 | |
#每次抽 100 个数 | |
#计算这100个数的平均值 | |
#计算这 10_000 次的平均值 | |
#以上步骤尝试100次 | |
module Solution | |
extend self | |
def go | |
all = [] | |
10_000.times { all << get_from_nd(2, 0.2) } | |
# aver_all = all.reduce(:+).to_f / 10_000 | |
count = 0 | |
100.times do | |
pick_up_100 = pick_non_repeat(all, 100) | |
aver_100_arr = [] | |
10_000.times do | |
random_100 = [] | |
100.times do | |
random_100 << pick_up_100[rand(100)] | |
end | |
aver_100_arr << random_100.reduce(:+).to_f / random_100.length | |
end | |
if (aver_100_arr.reduce(:+).to_f / aver_100_arr.length - 2).abs > 0.05 | |
count += 1 | |
end | |
end | |
count | |
end | |
def pick_non_repeat(arr, count) | |
range = arr.length | |
r = [] | |
i = 0 | |
while i <= count | |
gen = rand(range) | |
if !r.include? gen | |
r.push gen | |
i += 1 | |
end | |
end | |
r.map { |i| arr[i] } | |
end | |
def get_from_nd(mean, std_dev) | |
mean + random_nd * std_dev | |
end | |
def random_nd | |
w = 0.0 | |
u = 0.0 | |
v = 0.0 | |
c = 0.0 | |
while w ==0.0 || w >=1.0 | |
u = rand * 2 - 1.0 | |
v = rand * 2 - 1.0 | |
w = u * u + v * v | |
end | |
c = Math.sqrt(-2 * Math.log(w) / w) | |
u * c | |
end | |
end | |
puts Solution.go |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment