【问题标题】:select random value based on probability chance根据概率机会选择随机值
【发布时间】:2015-11-07 22:15:42
【问题描述】:

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

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 的组合会起作用吗?如果是这样,最好的方法是什么?

【问题讨论】:

标签: mysql sql database mysql-variables


【解决方案1】:

您可以通过使用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 的机会,但这将是另一个问题。

【讨论】:

    猜你喜欢
    • 2011-02-15
    • 2013-08-27
    • 2011-10-20
    • 1970-01-01
    • 2012-02-22
    • 2021-04-27
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    相关资源
    最近更新 更多