加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 随机重量项目

发布时间:2020-12-17 02:52:00 所属栏目:百科 来源:网络整理
导读:例如,我有这些数据: 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 现在我想根据
例如,我有这些数据:

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

现在我想根据他们的体重为每个标题服务.例如,对于前10个请求/迭代,heading1,heading3,heading2和heading4将按顺序(按重量)分别提供6,2,1和1次.

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

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

解决方法

这应该适用于您的基本情况,可以根据您需要的细节进行修改:

class Heading
   attr_reader :heading,:weight,:show_count

   def initialize(heading,weight=1)
     @heading=heading
     @weight=weight
     @show_count=0
   end

   def serve
     puts "Served #{@heading}! "  
     @show_count += 1
   end
 end

 class HeadingServer
   attr_reader :headings

   def initialize(headings_hash)
     @headings=headings_hash.map {|h,data| Heading.new(h,data[:weight])}
     @total_weight=@headings.inject(0) {|s,h| s+= h.weight}
   end

   def serve(num_to_serve=@total_weight)
     @headings.sort {|a,b| b.weight <=> a.weight}.each do |h| 
       n = (h.weight * num_to_serve) / @total_weight  #possibility of rounding errors
       n.times { h.serve }
     end
   end

   def total_views
     @headings.inject(0) {|s,h| s += h.show_count}
   end
 end

headings = { 
  :heading1 => { :weight => 60,:show_count => 0},:heading2 => { :weight => 10,:heading3 => { :weight => 20,:heading4 => { :weight => 10,:show_count => 0}
}

# Example Usage:

hs = HeadingServer.new(headings)

hs.serve(10)  

hs.headings.each {|h| puts "#{h.heading} : served #{h.show_count} times"}

puts "Total Views: #{hs.total_views}"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读