Skip to content

Instantly share code, notes, and snippets.

@yiyizym
Last active December 14, 2016 13:28
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 yiyizym/e7f4cd87253f904ce49ff1d445d3dc58 to your computer and use it in GitHub Desktop.
Save yiyizym/e7f4cd87253f904ce49ff1d445d3dc58 to your computer and use it in GitHub Desktop.
从 1% 的样本中评估总体的平均值
#!/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