我有一个 MySQL 表,其中有一行名为 cur_odds,它是一个百分比数字,表示该行被选中的百分比概率。例如,当您运行 100 个查询时,如何进行查询以大约该频率实际选择行?
我尝试了以下操作,但概率为 0.35 的行最终在大约 60-70% 的时间内被选中。
SELECT * FROM table ORDER BY RAND()*cur_odds DESC
表中cur_odds的所有值加起来正好为1。
If cur_odds
很少改变,你可以实现以下算法:
1)创建另一列prob_sum
,对于其中
prob_sum[0] := cur_odds[0]
对于 1
prob_sum[i] := prob_sum[i - 1] + cur_odds[i]
2)生成0到1之间的随机数:
rnd := 兰特(0,1)
3)找到第一行prob_sum > rnd
(如果您在prob_sum
,查询应该运行得更快):
创建索引 prob_sum_ind ON (prob_sum);
设置@rnd := RAND();
从 中选择 MIN(prob_sum),其中 prob_sum > @rnd;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)