可能重复:
在 PHP 中按权重生成随机结果?
我已经创建了一个数据库,在其中存储了 rss 提要的名称和链接。我已经制作了 rss 阅读器,到目前为止一切都很好。我想做一个新闻滚动条来显示提要的文章。但我想要给提要一些权重值,以便根据其对我的重要性选择每个提要,并在从数据库中的提要中自动选择提要时,其文章只会显示在滚动条中。关于我该怎么做的任何想法那???提前谢谢..
ps 我的问题是我怎样才能从数据库中随机加权选择提要,而不是如何显示提要的文章(我已经完成了这部分)。
可能重复:
在 PHP 中按权重生成随机结果?
我已经创建了一个数据库,在其中存储了 rss 提要的名称和链接。我已经制作了 rss 阅读器,到目前为止一切都很好。我想做一个新闻滚动条来显示提要的文章。但我想要给提要一些权重值,以便根据其对我的重要性选择每个提要,并在从数据库中的提要中自动选择提要时,其文章只会显示在滚动条中。关于我该怎么做的任何想法那???提前谢谢..
ps 我的问题是我怎样才能从数据库中随机加权选择提要,而不是如何显示提要的文章(我已经完成了这部分)。
有两种方法可以做到这一点,我可以从头顶想到:
选项 1:用数据集中的键值填充一个新数组,其中权重决定了一个项目的重复频率。然后这个数组中的比例与加权分布相匹配。只需使用$arr[array_rand($arr)]
. 虽然简单易懂,但如果有很多物品,或者重量值真的很高,这会在你的脸上爆炸。
$weighted = array();
foreach($items as $item) {
array_merge($weighted, array_fill(0, $item['weight'], $item['value']);
}
$result = $weighted[array_rand($weighted)];
选项 2. 对权重求和。选择一个介于 0 和权重之和之间的随机数。循环遍历数据集中的元素,与您选择的随机数进行比较。一旦你击中一个等于或大于随机索引的元素,就选择那个元素。
function findRandomWeighted(array $input) {
$weight = 0;
// I'm assuming you can get the weight from MySQL as well, so this loop really should not be required. In that case $weight becomes a parameter.
foreach($items as $item) {
$weight += $item['weight'];
}
$index = rand(1, $weight);
foreach($items as $item) {
$index -= $item['weight'];
if($index <= 0) { return $item['value'] }
}
return null;
}
在我们在下面的评论中进行对话之后,这里是一个包含代码的 Pastebin:
您可以找到实现和描述的快速算法 -加权随机(在 javascript 中,但我认为可以在几分钟内重写为 PHP)。它比遍历数组要快得多。