如何根据分配给每一行的概率机会从数据库中选择随机行。
例:

Make        Chance  Value
ALFA ROMEO  0.0024  20000
AUDI        0.0338  35000
BMW         0.0376  40000
CHEVROLET   0.0087  15000
CITROEN     0.016   15000
........

如何根据必须选择的随机性来选择随机品牌名称及其值。
rand()ORDER BY的组合可以工作吗?如果是这样,最好的方法是什么?

最佳答案

您可以使用rand(),然后使用累积和来完成此操作。假设它们的总和为100%:

select t.*
from (select t.*, (@cumep := @cumep + chance) as cumep
      from t cross join
           (select @cumep := 0, @r := rand()) params
     ) t
where @r between cumep - chance and cumep
limit 1;

笔记:
  • rand()在子查询中被调用一次以初始化变量。不需要多次调用rand()
  • 极有可能随机数将恰好位于两个值之间的边界上。 limit 1任意选择1。
  • 可以通过在cumep > @r时停止子查询来提高效率。
  • 值不必按任何特定顺序排列。
  • 可以对其进行修改以处理总和不等于1的机会,但这将是另一个问题。
  • 09-27 19:40