红包随机金额 /** * @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; }