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;
?>