直接贴代码
/**
* 波浪递减砍价算法
* @param $count 拆分数量
* @param $price 拆分总价
*/
function new_split_red_packet($count = 20, $price = 5)
{
//已砍价格数组
$aleadyList = [];
//已砍钱的总和
$aleadyCut = 0;
for ($i = 0; $i < $count; $i++) {
//此次砍价的最低钱数(总价-已砍总价/总次数-已砍次数)(相当于是向上随机)(转换为单位分)
$min = ($price - $aleadyCut) / ($count - count($aleadyList));
//控制波浪幅度 1-2之间
$max = $min * 1.5;
//随机生成砍价金额
$cutPrice = mt_rand($min * 100, $max * 100) / 100;
//如果是最后一个直接返回金额
if ($i == $count - 1) {
$cutPrice = round(($price * 100 - $aleadyCut * 100) / 100, 2);
}
//增加已砍总额
$aleadyCut = ($aleadyCut * 100 + $cutPrice * 100) / 100;
//砍价额度存入数组
$aleadyList[] = $cutPrice;
}
return $aleadyList;
}
注意事项:如果有php有安装BC库(高精确度函数库)可以使用BC库提供的函数进行运算