大略来说,便是把一个大整数m分解(直接以“分为单位,如1元即100)分解成n个小整数的过程,小整数的范围是[min, max]。

最大略的思路,先保底,每个小红包担保有min,然后每个要求都随机天生一个0到(max-min)范围的整数,再加上min便是红包的钱数。

这个算法虽然大略,但是有一个弊端:末了天生的红包可能都是min钱数的。
也便是说可能末了的红包都是0.01元的。

php红包算法php红包算法函数研讨 Python

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);

}

?>

发红包