【问题标题】:Random row selection with different probabilities具有不同概率的随机行选择
【发布时间】:2015-07-03 17:39:02
【问题描述】:
我正在寻找一种方法,从 400-500 行的表中获取 1 个随机行,但概率不完全相同。
例如:
我的桌子看起来像:
对象 - 排名
- Object_A 顶部
- Object_B 低
- Object_C 正常
我为一个对象获得了 3 个可能的排名,我希望排名为“Top”的对象获得三倍以上的机会。应该就像表中有 3 行 Object_A 一样。与普通相同,但几率只有两倍。
现在我得到了这个代码......
$result = mysqli_query($link, "SELECT * FROM objects ORDER BY RAND() LIMIT 1");
【问题讨论】:
标签:
sql
select
random
mysqli
probability
【解决方案1】:
假设您的排名列具有以下三个值:
3 top
2 normal
1 low
那么你可以做的是:
$rand = rand()%3 +1;
$result = mysqli_query($link, "
SELECT * FROM (
SELECT * FROM objects ORDER BY RAND()
) as t
WHERE rank >= {$rand} LIMIT 1"
);
关键是了解where条件:rank >= {$rand}。
- 当 rand 为
== 3 时,有 33% 的机会,只会返回 1 条最高记录。
- 当 rand 为
== 2 时,有 33% 的机会,仅返回 1 条最高记录(50% 机会)或 1 条正常记录(50% 机会),依此类推。
您可以通过分配不同的数字来调整权重。
例如,如果您希望第一行返回大约 80% 的时间,您可以指定 top 的值 10,然后执行以下操作:
$rand = rand()%10 +1;