select 基于概率chance的随机值

select random value based on probability chance

我如何select根据分配给每一行的概率机会从数据库中随机获取一行。
示例:

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

如何select根据必须选择的概率随机生成名称及其值。

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 的机会,但那将是另一个问题。