A-A+
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 /** * @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; ?>
有一个弊端,权重必须进行排序