Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 加权随机性。如何为刚刚添加到数据库中的行赋予更多权重?_Php_Sql_Random - Fatal编程技术网

Php 加权随机性。如何为刚刚添加到数据库中的行赋予更多权重?

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),而对于最旧

我正在从表中检索4个随机行。但是,我希望对刚刚插入到表中的行赋予更多的权重,而不会对较旧的行造成太大的惩罚

在PHP/SQL中有这样做的方法吗

SELECT *, (RAND() / id) AS o FROM your_table ORDER BY o LIMIT 4
这将按
o
排序,其中as
o
介于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)