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