随机加权选择事件

时间:2011-01-07 06:25:21

标签: php mysql random choice

  

可能重复:
  Generating random results by weight in PHP?

我已经建立了一个数据库,其中我存储了rss feeds.i的名称和链接,使得rss阅读器和一切都还可以。我想创建一个新闻滚动条,显示提要的文章。但我想给饲料一些重量值,以便每个饲料根据其对我的重要性进行选择,并自动从数据库中选择饲料时,其文章仅在滚动条中显示。任何想法如何我可以这样做吗???先谢谢..

P.S。我的问题是我怎样才能进行atotomatically随机加权选择 数据库而不是如何显示提要的文章(我已完成此部分)。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你可以找到实现和描述的快速算法 - weighted random(在javascript中,但我认为可以在几分钟内重写为PHP)。它比循环通过阵列快得多。