从ruby / rails中的数组加权随机选择

时间:2011-03-23 14:23:31

标签: ruby-on-rails ruby random

我在Rails中有一个模型,我想从中选择一个随机条目。 到目前为止,我已经使用这样的命名范围完成了它:

named_scope :random,  lambda { { :order=>'RAND()', :limit => 1  } }

但是现在我在模型中添加了一个整数字段'weight',表示每行应该被选中的概率。

我现在如何进行加权随机选择?

我在snippets.dzone.com上发现并尝试了两种扩展Array类并添加加权随机函数的方法,但两种方法都不起作用或为我选择随机项。

我正在使用REE 1.8.7和Rails 2.3。

2 个答案:

答案 0 :(得分:5)

也许我明白这完全错了,但你不能只用“权重”栏作为随机数的一个因素吗? (根据Db的不同,有必要采取一些预防措施来防止产品溢出。)

named_scope :random,  lambda { { :order=>'RAND()*weight', :limit => 1  } }

答案 1 :(得分:0)

在一个查询中,您应该:

  • 计算总重量
  • 乘以随机因子,给出权重阈值
  • 再次扫描表总和,直到达到重量阈值。

在SQL中,它会像这样(不是真的尝试过)

SELECT SUM(weight) FROM table INTO @totalwt;
@lim := FLOOR(RAND() * @totalwt);
SELECT id, weight, @total := @total + weight AS cumulativeWeight
     FROM table WHERE cumulativeWeight < @lim, (SELECT @total:=0) AS t;

Optimal query to fetch a cumulative sum in MySQL启发