1

我正在使用它来选择一个随机匹配,并测试它的结果,并绘制一个随机匹配,直到它满足while循环的标准:

m = Matchup.order("RANDOM()").first

循环设置为break10个循环后(避免无限循环),我会随意跳出循环,查看日志,看Matchup每次经过循环都是一样的。循环的简化版本是这样的:

counter = 0
while counter < 5
    m = Matchup.order("RANDOM()").first
    logger.debug('Matchup ID: ' + m.id)
    counter += 1
end

日志将如下所示:

Matchup ID: 7
Matchup ID: 7
Matchup ID: 7
Matchup ID: 7
Matchup ID: 7

为什么会m = Matchup.order("RANDOM()").first随意不拉不同的Matchup?最奇怪的部分是,有时它可以正常工作,而其他它卡在循环 b/cm中并没有改变。有什么建议么?

如果你想看到实际的循环,你可以在这里看到它(在getRandomMatchup函数中): https ://github.com/jackerman09/wdis/blob/master/app/controllers/static_pages_controller.rb

4

3 回答 3

2

添加另一个变体:)

ids = Matchup.pluck(:id)
m = Matchup.find( ids.shuffle.first )

id除非值集过多,否则这将很好地工作,在这种情况下,您正在改组一个非常大的数组。但是,在 1k 到 2k 的集合大小中,用户不会注意到它。

或者简单地说:

ids = Matchup.pluck(:id)
m = Matchup.find( ids.sample )

将从ids数组中选择一个随机项目。

于 2013-10-15T14:49:34.787 回答
1

假设这个模型是一个普通的 ActiveRecord 模型,你可以尝试类似:

max_id = Matchup.maximum(:id)
id = rand(max_id)
m = Matchup.find(id)
...

这样做可能比要求数据库让您随机排序的记录便宜。但是,这种方法的缺点是记录可能会被删除,因此Matchup.find(id)可能会被删除nil

另一种更好的方法可能是:

ids = Matchup.pluck(:id)
m = Matchup.find(ids[rand(ids.length)])
于 2013-10-15T14:46:39.897 回答
1

您可以为此使用随机播放:-

Matchup.all.shuffle!.first
于 2013-10-15T14:49:09.013 回答