最近自己开发了一个类似微信抢红包的功能,在网上找了很多红包生成的函数,但都不是那么完美,于是自己动手写了一个。 ( 阿荣原创^_^ ) //$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));
|