【问题标题】:Randomly selecting between N maximal values and returning key in Ruby hash在 N 个最大值之间随机选择并在 Ruby 哈希中返回键
【发布时间】:2012-02-05 11:28:11
【问题描述】:

假设我有一个 FruitDetector 类,它接受一个字符串并以哈希的形式返回具有不同概率的水果的可能类型:

type = {
  banana: 0.2,
  lemon: 0.4,
  orange: 0.4
}

从散列的 N 个最大值中选择一个随机元素(在本例中是在柠檬和橙子之间随机选择)并返回水果名称的最干净、最惯用的方法是什么?

【问题讨论】:

    标签: ruby random dictionary idioms


    【解决方案1】:
    type.group_by{|k, v| v}.max.last.sample.first
    

    【讨论】:

    • 这也有效,但必须进行编辑以在末尾添加 .first (否则它会返回一个数组):type.group_by{|k, v| v}.max.last.sample.first。它更干净,但比以前的解决方案慢两倍(@Howard,请参阅benchmark),所以我将另一个作为接受的答案。
    【解决方案2】:

    最干净的方法是一步一步来:

    # determine maximum weight
    maxw = type.values.max
    
    # select items with maximum weight
    selection = type.select{|item, weight| weight == maxw}
    
    # choose random item from selection
    p selection.keys.sample
    

    【讨论】:

    • 只需将.map{|item, weight| weight} 更改为.values 即可。
    • @DavidGrayson 当然你是对的。之前有不同的表达方式,不过.values就够了。
    • 谢谢。这就是我最终做的事情(根据你的回答,但更短):types.select { |i,j| j == types.values.max }.keys.sample 这看起来对吗? types.values.max 是否会在每次迭代时重新计算?
    • @louism 是的,它将在每次迭代时重新计算。而sample 是个好主意,没想到。
    • 好,所以最短有效的方法是:maxw = types.values.max; selection = types.select { |i,j| j == maxw }.keys.sample
    猜你喜欢
    • 2011-05-19
    • 2012-10-11
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2014-07-11
    • 2011-08-22
    相关资源
    最近更新 更多