不同概率的随机行选择

Random row selection with different probabilities

我正在寻找一种从 table 中获取 400-500 行 1 个随机行但概率不同的方法。

例如: 我的 table 看起来像:

对象 - 等级

我为一个对象获得了 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;