红包随机金额 /** * @param $total 总金额 * @param $num 红包数 * @param float $min 每个红包最小金额 * @return array */function hongbao($total, $num, $min=0.01 ){ $list = array(); for ($i=1;$i$num;$i++) { $safe_total=($tota
/**
* @param $total 总金额
* @param $num 红包数
* @param float $min 每个红包最小金额
* @return array
*/
function hongbao($total, $num, $min=0.01 ){
$list = array();
for ($i=1;$i<$num;$i++)
{
$safe_total=($total-($num-$i)*$min)/($num-$i); //随机安全上限
$money=mt_rand($min*100,$safe_total*100)/100;
$total=$total-$money;
array_push( $list, $money );
}
array_push( $list, round($total, 2) );
shuffle($list);
return $list;
}
//二 最小金额随机
function hongbao($total, $num ){
$ex = $total/$num/2;
$min = mt_rand(1, $ex*100) / 100; //随机最小金额
$list = array();
for ($i=1;$i<$num;$i++)
{
$safe_total=($total-($num-$i)*$min)/($num-$i);
$money=mt_rand($min*100,$safe_total*100)/100;
$total=$total-$money;
array_push( $list, $money );
}
array_push( $list, round($total, 2) );
shuffle($list);
return $list;
}
/** 三:
* 红包生成算法
* @param $money 总金额
* @param $number 红包数量
* @param $ratio 浮动系数
*/
function hongbao2($money,$number,$ratio = 0.5){
$res = array(); //结果数组
$min = ($money / $number) * (1 - $ratio); //最小值
$max = ($money / $number) * (1 + $ratio); //最大值
/*--- 第一步:分配低保 ---*/
for($i=0;$i<$number;$i++){
$res[$i] = $min;
}
$money = $money - $min * $number;
/*--- 第二步:随机分配 ---*/
$randRatio = 100;
$randMax = ($max - $min) * $randRatio;
for($i=0;$i<$number;$i++){
//随机分钱
$randRes = mt_rand(0,$randMax);
$randRes = $randRes / $randRatio;
if($money >= $randRes){ //余额充足
$res[$i] += $randRes;
$money -= $randRes;
}
elseif($money > 0){ //余额不足
$res[$i] += $money;
$money -= $money;
}
else{ //没有余额
break;
}
}
/*--- 第三步:平均分配上一步剩余 ---*/
if($money > 0){
$avg = $money / $number;
for($i=0;$i<$number;$i++){
$res[$i] += $avg;
}
$money = 0;
}
/*--- 第四步:打乱顺序 ---*/
shuffle($res);
/*--- 第五步:格式化金额(可选) ---*/
foreach($res as $k=>$v){
//两位小数,不四舍五入
preg_match('/^\d+(\.\d{1,2})?/',$v,$match);
$match[0] = round($match[0],2);
$res[$k] = $match[0];
}
return $res;
}
