Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 事件的随机加权选择_Php_Mysql_Random_Choice - Fatal编程技术网

Php 事件的随机加权选择

Php 事件的随机加权选择,php,mysql,random,choice,Php,Mysql,Random,Choice,可能重复: 我制作了一个数据库,其中存储了rss提要的名称和链接。我制作了rss阅读器,到目前为止一切正常。我想制作一个新闻滚动条,显示提要的文章。但我想给提要一些权重值,以便根据其对我的重要性自动选择每个提要当从数据库中选择一个提要时,它的文章只会显示在滚动条中。你知道我该怎么做吗???提前谢谢 p、 我的问题是,我如何能够自动地从数据库中随机加权选择提要 数据库,而不是如何显示提要的文章(我已经完成了这一部分)。有两种方法可以做到这一点,我可以从我的头脑中想到: 选项1:用数据集中的键值填

可能重复:

我制作了一个数据库,其中存储了rss提要的名称和链接。我制作了rss阅读器,到目前为止一切正常。我想制作一个新闻滚动条,显示提要的文章。但我想给提要一些权重值,以便根据其对我的重要性自动选择每个提要当从数据库中选择一个提要时,它的文章只会显示在滚动条中。你知道我该怎么做吗???提前谢谢

p、 我的问题是,我如何能够自动地从数据库中随机加权选择提要
数据库,而不是如何显示提要的文章(我已经完成了这一部分)。

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

选项1:用数据集中的键值填充一个新数组,其中权重决定项目重复的频率。然后,该数组中的比例与加权分布相匹配。只需使用
$arr[array\u 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;
}
函数findRandomWarted(数组$input){
$weight=0;
//我假设您也可以从MySQL获取权重,因此不需要这个循环。在这种情况下,$weight将成为一个参数。
foreach($items作为$item){
$weight+=$item['weight'];
}
$index=rand(1,$weight);
foreach($items作为$item){
$index-=$item['weight'];

如果($index您可以找到实现和描述的快速算法-(在javascript中,但我认为可以在几分钟内重写为PHP)。它比在数组中循环快得多。

+1第二个选项可能更快,也可能更容易实现。不,数据库不会有很多条目。最多10个提要…数据库只有3个字段。Id、提要名称、提要url。老实说,我不太明白您给我的第一个解决方案。我会尝试第二种方法是第一种方法。我对php不在行,看起来更简单。谢谢!!嗨,用户566487-第一个例子是什么:如果你有这样一个数组
$Feed=array(array('value'=>'Feed 1','weight'=>2),array('value'=>'Feed 2','weight'=>1),array('value'=>'Feed 3','weight'=>5))
,它创建了一个辅助数组,如:
数组(“提要1”、“提要1”、“提要2”、“提要3”、“提要3”、“提要3”、“提要3”);
每个元素插入的频率取决于其权重。然后,您可以使用array_rand()简单地随机拉出一个元素,它将根据您指定的权重随机设置。但如果您认为第二种方法更简单,请使用该方法,因为它更好:)对不起,我的朋友,我太糊涂了。我不知道如何使脚本从我的数据库中获取提要。当然,使用类似SELECT*from feeds的表达式,其中提要_id=产生随机加权值的变量。但是我不熟悉随机加权值的概念。我的意思是,我不知道如何合并您提出的想法bove与我的数据库。此外,在数据库中添加另一个字段和权重并在其中添加值是否有效。但我也不知道如何将它们组合起来。你不应该只给出指向另一个网站的链接作为答案,因为该网站可能在将来过时。相反,请单击“编辑”链接此答案,并在此处包含该页面中解决方案的基本部分。请参阅: