Tri*_*rip 5 ruby random weighted
如果我有数组:
ar = [1,3,5,3,6,1,4,6,7,6,6,6,6,6]
我可以减少这种情况的发生次数:
counts = {1=>2, 3=>2, 5=>1, 6=>7, 4=>1, 7=>1}
现在我想随机选择使用最少的数字以ar获得更高的权重
我了解如何根据最常用的数字轻松做出加权随机选择,但不能根据其倒数进行加权随机选择。
看起来这对你有用:
arr = [1,3,5,3,6,1,4,6,7,6,6,6,6,6]
arr.group_by(&:itself).transform_values{|v| arr.size / v.size}.flat_map do |k,v|
[k] * v
end.sample
Run Code Online (Sandbox Code Playgroud)
我们对元素进行分组并对它们进行计数,然后创建一个新的元素,并将Array元素数量反转以利于出现次数较少的元素。例如
arr.group_by(&:itself).transform_values{|v| arr.size / v.size}.flat_map do |k,v|
[k] * v
end.group_by(&:itself).transform_values(&:size)
#=> {1=>7, 3=>7, 5=>14, 6=>2, 4=>14, 7=>14}
Run Code Online (Sandbox Code Playgroud)
由于 5 最初出现过一次,现在出现了 14 次(与 4 和 7 相同)。因此,5、4 和 7 被选择的可能性相同,并且各自的可能性是 1 和 3 的两倍,而 1 和 3 出现的可能性是 6 的两倍和 7 倍。
也许这样的事情可能会更有效
grouping =arr.group_by(&:itself).transform_values(&:size).
scale = grouping.values.uniq.reduce(&:lcm)
grouping.flat_map do |k, v|
[k] * (scale / v)
end.sample
Run Code Online (Sandbox Code Playgroud)