【问题标题】:Server page based on weightage基于权重的服务器页面
【发布时间】:2011-02-17 15:45:34
【问题描述】:

假设我们有以下页面及其服务权重:

Page1    50%
Page2    20%
Page3    15%
Page4    15%

根据权重提供网页的简单公式是什么?我正在使用 Ruby。

这是我的想法。

actual_pct = Weightage 
tot_hits = Total hits against the URL
served_pct = Served percentage for each page based on tot_hits
served_to_actual_pct  = served_pct x 100 / actual_pct

上面会给我一个带有served_to_actual_pct的页面数组。假设当还没有提供页面或多个页面具有相同的served_to_actual_pct 时,我将根据它们的create timestamp 提供页面。

基于这个假设,我可以在create timestamp 上排序这个数组,然后在served_to_actual_pct 上排序。此时,数组中的第一页将是要提供的页面。

【问题讨论】:

  • 您的意思是使用这些权重从控制器提供不同的视图?
  • 它们是完全不同的页面,但针对单个 URL 提供服务。但我需要确保页面是根据它们的权重提供的。例如,如果 URL Page1、Page2、Page3 和 Page4 上共有 100 次点击,则应分别提供 50、20、15 和 15 次。是否有意义,还是我应该更详细地解释一下?

标签: ruby algorithm


【解决方案1】:

您需要的是加权样本:

class Hash
  def weighted_sample
    target = rand * self.values.reduce(:+)
    key, weight = self.detect{ |key, weight| target -= weight; target < 0 }
    return key
  end
end

添加任意数量的页面作为散列的键,并将它们的权重作为值。然后拨打your_hash.weighted_sample。具有较高值的​​键会更频繁地出现。

【讨论】:

  • 由于格式原因,我已将加权样本的结果作为单独的答案发布。请调查一下。
【解决方案2】:

在你的控制器中使用类似的东西

random = rand
if random < 0.5
  render 'view_1'
elsif random < 0.7
  render 'view_2'
elsif random < 0.85
  render 'view_3'
else
  render 'view_4'
end

rand 返回一个介于 0 和 1 之间的随机浮点数。使用的 if/else 分支确保四个页面查看的概率分别为 50%、20%、15% 和 15%。

【讨论】:

  • 嗯...这看起来不错。第一件事是页数可能会有所不同——不过,它是可以处理的。但我认为我们可能需要更进一步,将点击量精确分配到它们的权重。
  • 这应该执行得相当准确 (+- 1%),但是如果您需要 exact 权重,则可能需要在每个页面视图上存储一些数据,并决定下一个基于已经存储的。
  • 是的,我确实会计算单个页面的每个页面浏览量。
猜你喜欢
  • 2022-10-30
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 2020-09-13
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
相关资源
最近更新 更多