大略来说,便是把一个大整数m分解(直接以“分为单位,如1元即100)分解成n个小整数的过程,小整数的范围是[min, max]。
最大略的思路,先保底,每个小红包担保有min,然后每个要求都随机天生一个0到(max-min)范围的整数,再加上min便是红包的钱数。
这个算法虽然大略,但是有一个弊端:末了天生的红包可能都是min钱数的。也便是说可能末了的红包都是0.01元的。
php红包算法
<?php
header(\"大众Content-Type: text/html;charset=utf-8\"大众);//输出不乱码,你懂的
$total=10000;//红包总额
$num=10;// 分成8个红包,支持8人随机领取
$min=10;//每个人最少能收到0.01元
echo '<pre>';
$redarr=array();
for ($i=1;$i<=$num;$i++)
{
$red=getredmoney($i,$total,$num,$min);
$total=$total-$red['money'];
echo '第'.$i.'个红包:'.$red['money'].' 元,余额:'.$red['total'].' 元 <br/>';
$redarr[]=$red['money'];
}
echo '总金额:'.array_sum($redarr);
/
获取红包
@param $i 第几个人
@param $total 剩余总红包金额
@param $num 总人数
@param $min 最小得到金额
@param $point 保留小数位数
/
function getredmoney($i,$total,$num=10,$min=1,$point=0){
if($i==$num){
$money=$total;
}else{
$pre=$total/($num-$i+1);
if($pre==$min){
$money=$min;
}else if($pre<$min || ($pre-$min)<1){
$safe_total=$total-($num-$i)$min;//随机安全上限
$money=@mt_rand($min100,$safe_total100)/100;
}else{
$safe_total=($total-($num-$i)$min)/($num-$i);//随机安全上限
$money=@mt_rand($min100,$safe_total100)/100;
if($money<$min)$money=$min;
}
$money=round($money,$point);
}
$total=$total-$money;
return array('i'=>$i,'money'=>$money,'total'=>$total);
}
?>
发红包