最近自己开发了一个类似微信抢红包的功能,在网上找了很多红包生成的函数,但都不是那么完美,于是自己动手写了一个。
( 阿荣原创^_^ )
//$money 是发红包的总金额, $num 红包生成的数量
/**
* 生成单个红包
* @param float $money 红包金额(单位:元)
* @param int $num 红包个数
* @return float 单个红包的金额
*/
function makeSingleLuckMoney($money, $num) {
if ($num == 1) {
return round($money, 2);
}
$avg = $money / $num;
if ($avg < 0.1) {
$min = 0.01;
} else {
$min = $avg / 4;
}
$useMoney = $money - $num * $min;
if (($useMoney == 0) || ($useMoney < 0.02)) {
return $min;
}
$arr = array();
$c = $num;
for ($i = 0; $i < $c; $i++) {
$useMoney = $money - $num * $min;
$tmp = rand(1, $useMoney * 100) / 100;
$max = $useMoney / 2;
if ($tmp > $max) {
$n = $min + $max;
} else {
$n = $min + $tmp;
}
$tmpMoney = floor($n * 100) / 100;
$money = $money - $tmpMoney;
$num--;
$arr[] = $tmpMoney;
}
$keyNum = count($arr);
if ($keyNum > 1) {
$key = rand(0, $keyNum - 1);
} else {
$key = 0;
}
return floor($arr[$key] * 100) / 100;
}
/**
* 生成所有红包
* @param float $money 红包金额(单位:元)
* @param int $num 红包个数
* @return array 所有单个红包金额组成的数组
*/
function makeAllLuckMoney($money, $num) {
$leftMoney = $money;
$leftNum = $num;
$resultArr = array();
for ($i = 0; $i < $num; $i++) {
$resultArr[] = $luckMoney = makeSingleLuckMoney($leftMoney, $leftNum);
$leftMoney = $leftMoney - $luckMoney;
$leftNum--;
}
shuffle($resultArr);
return $resultArr;
}
//example
print_r(makeAllLuckMoney(10, 7));