【发布时间】:2011-05-03 02:24:52
【问题描述】:
我的数据库中有一些条目,在我的情况下是带有评分和受欢迎程度以及其他因素的视频。在所有这些因素中,我计算了一个或多个似然因素,即提升因素。
所以我基本上有字段 ID 和 BOOST。boost 的计算方式是,结果是一个整数,表示比较应该命中此条目的频率百分比。
ID Boost
1 1
2 2
3 7
因此,如果我无限期地运行我的随机函数,我最终会在 ID 1 上获得 X 次命中,在 ID 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()) 进行范围查询,但是如果我更改它或开发一些交换算法或开发一些交换算法或一些东西......但这真的不是优雅的东西。
插入/更新和选择都应该很快!
你有解决这个问题的办法吗?
要考虑的最佳用例可能是广告投放。 “请以给定的概率选择一个随机广告”......但是我需要它用于另一个目的,但只是为了给你最后一张图片它应该做什么。
编辑:
感谢肯斯的回答,我想到了以下方法:
-
从 0-sum(distinct boost) 中计算一个随机值
SET @randval = (select ceil(rand() * sum(DISTINCT boost)) from test);
从所有加起来超过随机值的不同提升因子中选择提升因子
那么在我们的第一个示例中,1 的概率为 0.1,2 的概率为 0.2,7 的概率为 0.7。
- 现在从具有此提升因子的所有条目中随机选择一个条目
问题:因为具有一次提升的条目数总是不同的。例如,如果只有 1 个增强条目,我会在 10 个调用中的 1 个中得到它,但是如果有 100 万个有 7 个,则它们中的每一个都几乎不会返回...... 所以这行不通:(试图完善它。
我必须以某种方式将条目数包含在这个提升因子中......但我不知何故被困在了那个......
【问题讨论】:
-
好吧,我被卡住了,请帮帮我:D 我还考虑过选择一个子集,将概率除以 rand 值,但结果也不好......
标签: sql mysql random statistics