A-A+

php 按权重随机抽样方法

2012年06月04日 PHP技术文章 评论 1 条 阅读 402 views 次

在PHP设计系统时,有这样一个要求,就是在前台一个地方显示三个轮流广告,而按照客户付款的多少在同一天内显示的次数不一样,比如说 a,b,c 三个客户,a付款200,b付款300,c付款500,很显然,广告权重应该是 c客户 最大,也就是每显示十次广告,就有 c 客户五次,相对的,a客户有两次广告显示机会,b客户有三次显示机会,这种原理也就是 php 按权重随机抽样方法,根据权重大小来显示不同广告。

基于这种理论,那么我们就可以在PHP中给出三个权重值,将这三个权重值分别保存到数据中,也就是 array('a'=>200,'b'=>300,'c'=>500)。然后定义一个 roll 的函数进行权重的分配,这里要实现两个功能,第一就是加入 php 的干扰函数 rand,这样才在调用时不会出现一直调用一个广告值的问题,第二个功能就是核心的权值问题了。首先赋值两个变量 $_tmpW = 0; $rollnum = 0; 然后将通过 foreach () 循环进行调用,相应的将 $v 键值赋值 为 0,在下面的循环中进行递加,权值高的则会显示频繁,具体的源码如下,大家可以进行测试一下。

<?php   
/**  
 * @param array $weight 权重 例如array('a'=>200,'b'=>300,'c'=>500)  
 * @return string key 键名   
 */  
function roll($weight = array()) {   
 $roll = rand ( 1, array_sum ( $weight ) );   
 $_tmpW = 0;   
 $rollnum = 0;   
 foreach ( $weight as $k => $v ) {   
 $min = $_tmpW;   
 $_tmpW += $v;   
 $max = $_tmpW;   
 if ($roll > $min && $roll <= $max) {   
 $rollnum = $k;   
 break;   
}   
 }   
 return $rollnum;   
}   
  
$row=roll(array('a'=>200,'b'=>300,'c'=>500));   
echo $row;   
?>
标签:

1 条留言  访客:1 条  博主:0 条

  1. 1212121

    有一个弊端,权重必须进行排序

给我留言