我希望根据我在CSV上的最新彩票结果生成最可能的数字。
我有这个脚本:
h = Hash.new
f = File.open('numbers.csv', "r")
f.each_line { |line|
numbers = line.split
numbers.each { |w|
if h.has_key?(w)
h[w] = h[w] + 1
else
h[w] = 1
end
}
}
# sorteamos el hash por valor, y lo pintamos según la concurrencia
h.sort{|a,b| a[1]<=>b[1]}.each { |elem|
puts "\"#{elem[0]}\" tiene #{elem[1]} concurrencia"
}
这将告诉我哪些数字具有最多的数字。 我想&#34;样品&#34;取决于最有可能的这些结果的数字。
我怎样才能做到这一点?谢谢!
答案 0 :(得分:2)
我不认为Ruby有一种内置的优雅方式。您可以将散列视为一堆二进制数,其中每个数字的出现次数是二进制文件大小。然后,您可以计算总仓宽,获取随机样本,并迭代以找出样本所在的仓。
def weighted_sample h
weight = h.values.reduce(:+)
sample = rand weight
h.each do |n, w|
return n if sample < w
sample -= w
end
end
Array.new(10) { weighted_sample({1 => 8, 2 => 4, 3 => 2}) }
# [2, 2, 1, 1, 1, 3, 1, 1, 1, 1]
提示:有更好的方法来构建该哈希值
h = Hash.new 0
# ...
h[w] += 1