/** | |
* 拆分红包 | |
* @param SendRedPackageRequest $request | |
* @return array | |
*/ | |
protected function spitMoney(SendRedPackageRequest $request) | |
{ | |
$result = []; | |
$reamingMoney = $request->money; | |
for ($i = $request->count; $i >= 1; $i--) { | |
if ($i === 1) { | |
$result[] = round($reamingMoney, 2); | |
$reamingMoney = 0; | |
} else { | |
$average = round(bcdiv($reamingMoney, $i), 2); //平均值 | |
$amount = round(mt_rand(1, $average * 199) / 100, 2); | |
$reamingMoney = doubleval(bcsub($reamingMoney, $amount)); | |
$result[] = $amount; | |
} | |
} | |
return $result; | |
} |
逻辑比较简单,传入金额.和拆分的数量
首先循环要拆分的数量
判断如果是最后一个就把剩下的钱全部塞进去
如果不是,就取剩余的金额(第一次循环剩余的金额=总金额)除以剩下的次数,取得平均值,然后再随机取最小的0.01 和平均值*2
把剩余的金额更新一下就行了
算法模拟微信拆红包算法,但是这是提前计算拆分的数据保存的,微信是每次动态计算的
记得设置bcscale(2); 用来设置BC函数默认保留的小数位