Sai*_*aim 3 ruby arrays algorithm
例如,我有这些数据:
headings = {
:heading1 => { :weight => 60, :show_count => 0}
:heading2 => { :weight => 10, :show_count => 0}
:heading3 => { :weight => 20, :show_count => 0}
:heading4 => { :weight => 10, :show_count => 0}
}
total_views = 0
Run Code Online (Sandbox Code Playgroud)
现在我想根据他们的体重为每个标题服务.例如,对于第一个10请求/迭代heading1,heading3,heading2和heading4将分别在顺序(按重量计)提供服务6,2,1,和1次.
对于每次迭代,服务标题的show_count将递增1,total_views也将全局递增.
你可以建议一个算法或一些红宝石代码来处理这个问题.
你可以使用皮卡宝石
它接受这样的哈希:
require 'pickup'
headings = {
heading1: 60,
heading2: 10,
heading3: 20,
heading4: 10
}
pickup = Pickup.new(headings)
pickup.pick
#=> heading1
pickup.pick
#=> heading1
pickup.pick
#=> heading3
pickup.pick
#=> heading1
pickup.pick
#=> heading4
Run Code Online (Sandbox Code Playgroud)
所以你可以这样做:
require 'pickup'
headings = {
heading1: { :weight => 60, :show_count => 0},
heading2: { :weight => 10, :show_count => 0},
heading3: { :weight => 20, :show_count => 0},
heading4: { :weight => 10, :show_count => 0}
}
pickup_headings = headings.inject({}){ |h, (k,v)| h[k] = v[:weight]; h}
pickup = Pickup.new(pickup_headings)
# let's fire it 1000 times
1000.times do
server = pickup.pick
headings[server][:show_count] += 1
end
puts headings
#=> {
#=> :heading1=>{:weight=>60, :show_count=>601},
#=> :heading2=>{:weight=>10, :show_count=>116},
#=> :heading3=>{:weight=>20, :show_count=>176},
#=> :heading4=>{:weight=>10, :show_count=>107}
#=> }
Run Code Online (Sandbox Code Playgroud)