您可以通过使用
rand()然后再使用累积和来执行此操作。假设它们的总和为100%:
select t.*from (select t.*, (@cumep := @cumep + chance) as cumep from t cross join(select @cumep := 0, @r := rand()) params ) twhere @r between cumep - chance and cumeplimit 1;
笔记:
rand()
在子查询中被调用一次以初始化变量。多次调用rand()
是不可取的。- 随机数极有可能恰好位于两个值之间的边界上。的
limit 1
任意选择1。 - 通过在时停止子查询可以提高效率
cumep > @r
。 - 值不必按任何特定顺序排列。
- 可以对其进行修改以处理总和不等于1的机会,但这将是另一个问题。



