本篇文章给大家简析PHP拆红包算法,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。逻辑比较简单,传入金额.和拆分的数量。拿到这分配的金钱,使用redis队列方式存放起来,当客户点击领取的时候,出队列。这样不会多抢。redis的部分下面我就没针对描述了。
PHP拆红包算法
代码如下:
/**
* @param $total 总价钱
* @param $num 总分发的人数
* @param float $min 最新分多少 默认0.01
* @return array
*/
public function getRedPackage($total,$num,$min=0.01){
$old_total = $total;
$data=array();
if($min*$num>$total){
return [
'code' => 1,
'msg' => '最少数 * 人数不能大于总额'
];
}
for ($i=1;$i<=$num;$i++){
$money = 0;
if ($num - $i > 0) {//最后一个 除数为0 ,根据运行除数不能为0 只能 计算到 N - 1,需要再最后补上一个数
$safe_total = ($total - ($num - $i) * $min) / ($num - $i); # 随机安全上限 剩余的钱/此时的人数 = 此时的平均数 作为最大的数
$money = $this->money_val(intval($min * 100), intval($safe_total * 100)) / 100;
$total -= $money;
$data[] = "$money";//转字符串
}
}
array_push($data,sprintf("%.2f",$old_total - array_sum($data)));//把最后一个值放在数据中
return $data;
}
private function money_val($min,$max){
if ($min > $max){
$min = $min;
}else{
$min = rand($min,$max);
}
return $min;
}