不同概率的随机行选择
Random row selection with different probabilities
我正在寻找一种从 table 中获取 400-500 行 1 个随机行但概率不同的方法。
例如:
我的 table 看起来像:
对象 - 等级
- Object_A 顶
- Object_B 低
- Object_C正常
我为一个对象获得了 3 个可能的排名,我希望排名为 "Top" 的对象获得三倍的机会。 table 中应该有 3 行 Object_A。与正常相同,但只有两倍的机会。
现在我得到了这个代码...
$result = mysqli_query($link, "SELECT * FROM objects ORDER BY RAND() LIMIT 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;
我正在寻找一种从 table 中获取 400-500 行 1 个随机行但概率不同的方法。
例如: 我的 table 看起来像:
对象 - 等级
- Object_A 顶
- Object_B 低
- Object_C正常
我为一个对象获得了 3 个可能的排名,我希望排名为 "Top" 的对象获得三倍的机会。 table 中应该有 3 行 Object_A。与正常相同,但只有两倍的机会。
现在我得到了这个代码...
$result = mysqli_query($link, "SELECT * FROM objects ORDER BY RAND() LIMIT 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;