假设我们的奖品是如下:
$prize = array(
'0' => array('id'=>1,'prize'=>'ipad','v'=>1),
'1' => array('id'=>2,'prize'=>'iphone9','v'=>5),
'2' => array('id'=>3,'prize'=>'小米音箱','v'=>10),
'3' => array('id'=>4,'prize'=>'4GU盘','v'=>12),
'4' => array('id'=>5,'prize'=>'10Q币','v'=>22),
'5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),
);
v表示中奖占比,比如说所有v加起来是100,而这里的ipad为1,表示中奖概率为1%。
算法思路
$data
为一个预设的数组,假设数组为[100,200,300,400]
,最开始数据从1,1000这个范围内选一个数出来,如果不在这个范围内,则缩小范围,在这个例子中就是减去100,也就是第二个数在1,900这个范围内筛选,这样一直下去总会有一个满足要求。相当于在一个盒子里拿小球,第一个不是,第二个不是,第三个不是。。。全部取完,总会有一个是。
function gen_rand($data) {
$result = '';
$sum = array_sum($data); //计算总权重
foreach($data as $key => $val) {
$randNum = mt_rand(1, $sum);
if($randNum <= $val) {
$result = $key;
break;
} else {
$sum -= $val;
}
}
unset($data);
return $result;
}
生成$data
数组的方法
$keys = array_keys($prize);
$vals = array_column($prize, 'v');
$data = array_combine($keys,$vals);