PHP从二维数组中根据权重随机取出一个元素,权重越高取出的概率越高,抽奖的简单算法。
二维数组数据如下,weight代表权重大小
$data = [
['id'=>1,'name'=>'特等奖','weight'=>1],
['id'=>2,'name'=>'一等奖','weight'=>3],
['id'=>3,'name'=>'二等奖','weight'=>5],
['id'=>4,'name'=>'三等奖','weight'=>10],
['id'=>5,'name'=>'四等奖','weight'=>20],
['id'=>6,'name'=>'五等奖','weight'=>30],
['id'=>7,'name'=>'谢谢抽奖','weight'=>100]
];
方法一:按照权重生成一个数组,数组随机取值即可。
function weight(array $data){
$res = $tmp = array();
$weight = 0;
if(!empty($data)){
foreach($data as $v){
$weight += $v['weight'];
for ($i = 0; $i < $v['weight']; $i++) {
$tmp[] = $v;
}
}
$res = $tmp[array_rand($tmp,1)];
}
return $res;
}
上述代码可以简单的实现权重随机取值,但是如果weight值也很大的时候,上述程序运行速度影响很大。
方法二:把二维数组的元素根据权重看成1个线段,根据总线段取出随机1个值判断在哪个线段上即可。
function weight(array $data){
$res = array();
$rand = rand(1,array_sum(array_column($data,'weight')));
if(!empty($data)){
$weight = 0;
foreach($data as $v){
$weight += $v['weight'];
if($weight>=$rand){
$res = $v;
break;
}
}
}
return $res;
}
上述代码解决了weight值太大导致程序运行时间太长问题。在上述二种方法中通过100次取值测试,方法二要比方法一快4倍以上。所以建议选择方法二
目前有 0 条评论