【问题标题】: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;
    

    【讨论】:

      猜你喜欢
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 2023-04-03
      • 1970-01-01
      • 2012-10-13
      • 2012-10-06
      相关资源
      最近更新 更多