【发布时间】:2010-07-08 14:47:05
【问题描述】:
我知道有this question很相似,但我想补充一下我的具体情况,看看答案是否不同。
我读到您可以简单地执行 ORDER BY RAND() ,但这对于大型表来说是个坏主意。但是,我可以使用 WHERE 子句将我的行数限制为最多 160 行。所以问题是,WHERE 子句是否在 ORDER BY RAND() 之前进行评估和处理,从而使其成为可接受的解决方案?
我的场景是我正在实现一个纸牌游戏。我有一张牌桌和一张牌桌。我试图从deck_cards 表中简单地抽取n 张随机卡片。每个游戏都有一个单独的牌组,因此当玩家抽 n 张牌时,我知道它来自特定牌组,因此建议的查询是
select id
from deck_cards
where deck_id = ? and draw_pile = true
order by rand()
limit 5
draw_pile 列就是它听起来的样子,我会跟踪卡片在 draw_pile 或 discard_pile 中的位置。
顺便说一句,我在 rails 中执行此操作,并尝试使用 Array.sort_by { rand } 对结果进行洗牌,但我看到有证据表明 rails rand 并不是完全随机的。所以另一个问题是在 SQL 或 rails 中尝试 random 函数是否更好。目前,我在 SQL 中没有 ORDER BY RAND 或 Limit。我在 rails 中对结果数组进行洗牌,然后从那个洗牌的数组中弹出 n 张牌。但同样,我看到的结果表明洗牌并不是真正随机洗牌。
另一个问题/解决方案可能是表锁定。这是一款多人实时游戏应用程序。偶尔我会看到超过 1 名玩家抽到同一张牌。我假设这是来自玩家同时绘图并点击此查询和随机播放,它们以某种方式返回重叠结果。
【问题讨论】:
标签: mysql ruby-on-rails random