【PHP原生】随机红包分类算法
随机红包分配算法
1、数值波动大
header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 $total=10;//红包总额 $num=8;// 分成8个红包,支持8人随机领取 $min=0.01;//每个人最少能收到0.01元 for($i=1;$i<$num;$i++) { $safe_total=$total-($num-$i)*$min;//随机安全上限 $money=mt_rand($min*100,$safe_total*100)/100; $total=$total-$money; echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 <br/>'; } echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';
2、波动较小
<?php /** * 生成随机数(返回数组) *$send_total 总额 * $send_min 最小值 * $send_max 最大值 * $count 总人数 * return Array */ function randMoney($send_total, $send_min, $send_max, $count) { $money = $send_total - $send_min * $count; //$money表示可以用于分配的金额 $people = array_fill(0, $count, $send_min); //$people是一个以最小金额值组成的一位数组,元素个数等于$count do{ $lucky_index = mt_rand(0, $count -1); //$lucky_index表示下标为$people数组的任意随机元素 $lucky_money = floatval(substr(mt_rand()/ mt_getrandmax(),0,4)); //$lucky_money表示任意小数 if($people[$lucky_index]+ $lucky_money > $send_max){ continue; } if($money <1){ //剩余可分配的金额小于1时,直接全部赋予累加到$people数组的某个元素上(满足所有金额相加等于总金额) //可能会导致某个分配金额超过最大值。$m = $money语句改成break即可避免。 $m = $money; }else{ $m = $lucky_money; } $people[$lucky_index]+= $m; $money -= $m; }while($money >0); return $people; }
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号