我的数据库中有一些条目,例如我的视频,其中包含评分,受欢迎程度和其他因素。在所有这些因素中,我计算一个或多个可能性因素,或者说是一个提升因素。
所以本质上我有ID和BOOST字段。boost的计算方式是一个整数,表示该条目在比较中应该被击中的频率的百分比。
ID Boost
1 1
2 2
3 7
因此,如果我无限期地运行随机函数,我应该在ID 1上获得X次点击,在ID 2上获得2倍,在ID 3上获得7倍。
因此,每次点击都应是随机的,但概率为(boost / sum of boosts)
。因此,在此示例中ID
3的概率应为0.7(因为总和为10。为简单起见,我选择了这些值)。
我想到了类似以下查询的内容:
SELECT id FROM table WHERE CEIL(RAND() * MAX(boost)) >= boost ORDER BY rand();
不幸的是,在考虑了表中的以下条目后,这行不通了:
ID Boost
1 1
2 2
机会只有50/50的情况下,只有第二个元素或两个元素可供选择。
因此,将0.5命中分配给第二个元素,将0.5命中分配给(第二个和第一个)元素,这些元素是随机选择的,因此每个0.25。所以我们最终得到0.25 /
0.75的比率,但是应该是0.33 / 0.66
我需要一些修改或新的方法来以良好的性能执行此操作。
我也考虑过要累积存储boost字段,所以我只需要从(0-sum()
)进行范围查询,但是如果我更改了它或开发了一些交换算法或其他东西,那么我将不得不重新索引一个项目之后的所有内容。真的不是优雅的东西。
插入/更新和选择都应该很快!
您对此问题有解决方案吗?
要考虑的最佳用例可能是广告投放。“请以给定的概率选择一个随机广告” …但是我需要将其用于其他目的,而只是给您最后一张图片它应该做什么。
编辑:
感谢kens的回答,我想到了以下方法:
SET @randval =(从测试中选择ceil(rand()* sum(DISTINCT boost)));
那么我们在第一个示例1中的概率为0.1,2的概率为0.2,7的概率为0.7。
问题:
因为一次提升的条目数总是不同的。例如,如果只有1个增强的项,那么我会在10个调用中有1个得到它,但是如果有1个具有7个调用,则几乎不会返回它们……因此这行不通:(尝试对其进行优化。
我必须以某种方式包括具有该提升因子的条目数…但是我却以某种方式停留在那…
您需要为每行生成一个随机数并对其加权。
在这种情况下,RAND(CHECKSUM(NEWID()))
绕过的“每个查询”评估RAND
。然后只需将其乘以boost,然后将ORDER
BY乘以结果DESC。该SUM..OVER
给你的总升压
DECLARE @sample TABLE (id int, boost int)
INSERT @sample VALUES (1, 1), (2, 2), (3, 7)
SELECT
RAND(CHECKSUM(NEWID())) * boost AS weighted,
SUM(boost) OVER () AS boostcount,
id
FROM
@sample
GROUP BY
id, boost
ORDER BY
weighted DESC
如果您有不同的提升值(我想您已经提到过),我也将考虑使用LOG(以e为底)来平滑分布。
最后,ORDER BY NEWID()是不考虑提升的随机性。播种RAND很有用,但不能单独播种。
该示例放到了SQL Server 2008 BTW上
问题内容: 在Java中,如何生成随机数,但如何使该随机数偏向特定数字。例如,我想生成一个介于1到100之间的数字,但是我希望该数字偏向75。但是我仍然希望能够获得该范围内的其他数字,但是我希望获得数字的更多变化接近75,而不是仅仅获得整个范围内的随机数。谢谢 问题答案: 尝试http://download.oracle.com/javase/6/docs/api/java/util/Random
问题内容: 我正在使用MSSQL Server2005。在我的数据库中,我有一个表“ customerNames”,其中有两列“ Id”和“ Name”以及大约。1,000个结果。 我正在创建一个功能,每次必须随机选择5个客户。谁能告诉我如何创建一个查询,该查询每次执行查询时都会随机获得5行(Id和Name)? 问题答案: 也就是说,似乎每个人都可以访问此页面,以获取对您的问题的更一般的答案: 在
问题内容: 如何在纯SQL中请求随机行(或尽可能接近真正的随机行)? 问题答案: 参见这篇文章:SQL从数据库表中选择一个随机行。它介绍了在MySQL,PostgreSQL,Microsoft SQL Server,IBM DB2和Oracle中执行此操作的方法(以下内容从该链接复制而来): 使用MySQL选择一个随机行: 使用PostgreSQL选择一个随机行: 使用Microsoft SQL
问题内容: 我有大约1000行的表。我必须将n个随机行的表中的column(“ X”)更新为’Y’。为此,我可以有以下查询 是否有另一种有效的方式来编写此查询。该表没有索引。请帮忙? 问题答案: 我将使用ROWID: 我使用ROWID的实际原因并不是为了提高效率(它仍然会进行全表扫描)-如果列不是唯一的,则您的SQL可能不会更新所需的行数。 只有1000行,您不必担心效率(也许有一亿行)。该表上没
在前面的章节中,我们开发了深入描述数据所需的技能。 数据科学家也必须能够理解随机性。 例如,他们必须能够随机将个体分配到实验组和对照组,然后试图说明,观察到的两组结果之间的差异是否仅仅是由于随机分配,或真正由于实验所致。 在这一章中,我们开始分析随机性。 首先,我们将使用 Python 进行随机选择。 在numpy中有一个叫做random的子模块,它包含许多涉及随机选择的函数。 其中一个函数称为c
有没有一种方法可以在NetworkX甚至没有NetworkX的情况下做到这一点?