生成有偏随机数据

问题:

你想生成随机数字,但又希望这些数字具有某种倾向性,也就是说这些数字出现在某个范围内的概率会比出现在其他范围内的概率更高。例如,你想要根据每个广告活动未展示的剩余数目成比例地推出一系列网页横幅广告。

方案:

使用如例下所示的pc_rand_weighted()函数。

<?php
//返回加权随机选择的键
function pc_rand_weighted($numbers)
{
    $total = 0;
    foreach ($numbers as $number => $weight) {
        $total += $weight;
        $distribution[$number] = $total;
    }
    $rand = mt_rand(0, $total - 1);
    foreach ($distribution as $number => $weights) {
        if ($rand < $weights) {
            return $number;
        }
    }
}
?>

讨论

想像一下,如果不使用一个期值为剩余展示数目的数组,而是用一个广告数组,其中每个广告的实际展示次数都与该广告的剩余展示数目一样多。你可以简单地在数组中选取一个未加权的随机位置,并从该位置开始展示。

如果广告的剩余展示数目达到百万级的话,使用这种技术则会消耗大量的内存。相反,你可以计算相应数组的大小(通过对剩余展示数目求合计算),从这个伪数组的元素总数中选取一个随机的数字,然后遍历该数组并找出与所选数字对应的广告。例如:

<?php
$ads = array('ford' => 12234,  //广告客户,剩余展示数目
             'att' => 33434, 
             'ibm' => 16823
);
$ad = pc_rand_weighted($ads);
?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值