根据概率机会选择随机值

Dha*_*man 5 mysql sql database mysql-variables

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

Make        Chance  Value
ALFA ROMEO  0.0024  20000
AUDI        0.0338  35000
BMW         0.0376  40000
CHEVROLET   0.0087  15000
CITROEN     0.016   15000
........
Run Code Online (Sandbox Code Playgroud)

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

将组合rand()ORDER BY工作?如果是这样,最好的方法是什么?

Gor*_*off 7

您可以通过使用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;
Run Code Online (Sandbox Code Playgroud)

笔记:

  • rand()在子查询中调用一次以初始化变量.多次呼叫rand()是不可取的.
  • 随机数很可能恰好位于两个值之间的边界上.的limit 1任意选择1.
  • 通过在何时停止子查询可以提高效率cumep > @r.
  • 值不必按任何特定顺序排列.
  • 这可以被修改以处理总和不等于1的机会,但那将是另一个问题.