按重量随机项目

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,heading2heading4将分别在顺序(按重量计)提供服务6,2,1,和1次.

对于每次迭代,服务标题的show_count将递增1,total_views也将全局递增.

你可以建议一个算法或一些红宝石代码来处理这个问题.

fl0*_*00r 6

你可以使用皮卡宝石

它接受这样的哈希:

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)