2

可能重复:
在 PHP 中按权重生成随机结果?

我已经创建了一个数据库,在其中存储了 rss 提要的名称和链接。我已经制作了 rss 阅读器,到目前为止一切都很好。我想做一个新闻滚动条来显示提要的文章。但我想要给提要一些权重值,以便根据其对我的重要性选择每个提要,并在从数据库中的提要中自动选择提要时,其文章只会显示在滚动条中。关于我该怎么做的任何想法那???提前谢谢..

ps 我的问题是我怎样才能从数据库中随机加权选择提要,而不是如何显示提要的文章(我已经完成了这部分)。

4

2 回答 2

6

有两种方法可以做到这一点,我可以从头顶想到:

选项 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:

http://pastebin.com/bLbhThhj

于 2011-01-07T06:36:13.687 回答
0

您可以找到实现和描述的快速算法 -加权随机(在 javascript 中,但我认为可以在几分钟内重写为 PHP)。它比遍历数组要快得多。

于 2012-06-11T17:45:04.940 回答