background image

php 按权重随机抽样方法

    在 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 代码
<?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;   
?>