我在Rails中有一个模型,我想从中选择一个随机条目。 到目前为止,我已经使用这样的命名范围完成了它:
named_scope :random, lambda { { :order=>'RAND()', :limit => 1 } }
但是现在我在模型中添加了一个整数字段'weight',表示每行应该被选中的概率。
我现在如何进行加权随机选择?
我在snippets.dzone.com上发现并尝试了两种扩展Array类并添加加权随机函数的方法,但两种方法都不起作用或为我选择随机项。
我正在使用REE 1.8.7和Rails 2.3。
答案 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;