Php 加权随机性。如何为刚刚添加到数据库中的行赋予更多权重?
我正在从表中检索4个随机行。但是,我希望对刚刚插入到表中的行赋予更多的权重,而不会对较旧的行造成太大的惩罚 在PHP/SQL中有这样做的方法吗Php 加权随机性。如何为刚刚添加到数据库中的行赋予更多权重?,php,sql,random,Php,Sql,Random,我正在从表中检索4个随机行。但是,我希望对刚刚插入到表中的行赋予更多的权重,而不会对较旧的行造成太大的惩罚 在PHP/SQL中有这样做的方法吗 SELECT *, (RAND() / id) AS o FROM your_table ORDER BY o LIMIT 4 这将按o排序,其中aso是介于0和1之间的某个随机整数/id,这意味着行越老,其o值越低(但仍然是随机顺序) 这将把id/maxId定量的一半加到随机值上。即,对于最新条目,添加了0.5(作为id/maxId=1),而对于最旧
SELECT *, (RAND() / id) AS o FROM your_table ORDER BY o LIMIT 4
这将按o
排序,其中aso
是介于0和1之间的某个随机整数
/id
,这意味着行越老,其o
值越低(但仍然是随机顺序)
这将把id/maxId
定量的一半加到随机值上。即,对于最新条目,添加了0.5
(作为id/maxId=1
),而对于最旧条目,不添加任何内容
同样,您也可以实现其他权重函数。这取决于您希望如何准确地对这些值进行加权。我认为一个令人满意的解决方案是将渐近函数(1/x)与加权结合使用 已对以下各项进行了测试:
SELECT *, (Rand()*10 + (1/(max_id - id + 1))) AS weighted_random
FROM tbl1
ORDER BY weighted_random
DESC LIMIT 4
如果要在上述查询中获取max_id,只需将max_id替换为:
(SELECT id FROM tbl1 ORDER BY id DESC LIMIT 1)
示例:
假设你的最大id是1000
对于几个ID中的每个ID,我将计算出值:
1/(1000-id+1),简化为1/(1001-id):
身份证号码:1000
1/(1001-1000)=1/1=1
身份证号码:999
1/(1001-999)=1/2=.5
身份证号码:998
1/(1001-998)=1/3=.333
身份证号码:991
1/(1001-991)=1/10=.1
身份证号码:901
1/(1001-901)=1/100=.01
这个1/x的性质使得只有接近max的数字才具有显著的权重
您可以在此处看到关于渐近函数的+更多图表:
请注意,带正数的图表右侧是与此特定问题相关的唯一部分
操纵我们的方程式做不同的事情:
(Rand()*a+(1/(b*(max_id-id+1/b)))
我添加了两个值,“a”和“b”。。。每个人都会做不同的事情:
“a”越大,顺序对选择的影响就越小。重要的是要有一个相对较大的“a”,否则几乎只会选择最近的ID
“b”值越大,渐近曲线衰减到无意义权重的速度越快。如果希望对最近的行进行加权,我建议尝试使用“b”的值,例如:.5、.25或.1
等式末尾的1/b抵消了b值小于1时出现的问题
注意:
当您有大量id时,这不是一个非常有效的解决方案(就像目前介绍的其他解决方案一样),因为它会为每个单独的id计算一个值。选择top 4并按id desc排序行,它会首先为您提供最新的行。我不确定是否完全理解。目前,我将其命名为“选择myTable.*从myTable中,状态=1,按兰德排序()限制4”-如何修改它?好的,我猜您有一个主增量键(例如“id”)。现在改用以下查询:
“选择myTable.*(RAND()/myTable.id)作为myTable中的o,其中status=1 ORDER BY o LIMIT 4”
。(顺便说一句,你输入了“…和订单…”,我想这只是一个打字错误?)。这太棒了。谢谢。如果我想调整它,使最旧的行不会受到太多惩罚,我能做什么?您可以尝试将(RAND()/id)
替换为(RAND()*2/id)
。这给了RAND()
(RAND()*10+(1/(max_id-id+1)))
@oxo更多的权重:刚才添加了一些解释和示例。如果我能澄清什么,请告诉我。你的解释需要上百万次投票。谢谢你的澄清。@oxo::D.很高兴能帮上忙。
(SELECT id FROM tbl1 ORDER BY id DESC LIMIT 1)