方法1
private function hongbao($amount, $count, $isAverage = false)
{
$result = [];
$funPlus = function ($val) {
return $val * 100;
};
$funDiv = function ($val) {
//return $val / 100;
return bcdiv($val, 100, 2); // 返回2位小數
};
/*平均分*/
$item = number_format($amount / $count, 2, '.', '');
if ($isAverage) {
/*防止不能平分*/
if (abs($amount - $item * $count)>=0.001) {
return [];
}
for ($i = 0; $i < $count; $i++) {
$result[] = $item;
}
return $result;
}
for ($i = 0; $i < $count; $i++) {
$result[] = 0.01;
}
$leftCount = bcsub($amount, array_sum($result), 2) / 0.01;
if ($leftCount < 0) {
return [];
}
$loopCount = 0;
$loopSum = 0;
while ($loopSum <$leftCount){
$randomIndex = mt_rand(0, $count-1-$loopCount);
$result[$randomIndex] += 0.01;
$loopCount++;
$loopSum++;
if ($loopCount>=$count-1) {
$loopCount = 0;
}
}
for ($i=0; $i<$count; $i++) {
$result[$i] = number_format($result[$i], 2, '.', '');
}
//shuffle($result);
sort($result);
return $result;
}
方法2
/**
* 紅包隨機分配 調用前確保$amount與$count合理
* @param number $amount 紅包金額
* @param int $count 紅包數量
* @param bool $isAverage 是否平分
* @return array 失敗返回空數組
*/
private function assignRedpacket($amount, $count, $isAverage = false)
{
$result = [];
$funPlus = function ($val) {
return $val * 100;
};
$funDiv = function ($val) {
//return $val / 100;
return bcdiv($val, 100, 2); // 返回2位小數
};
/*平均分*/
$item = number_format($amount / $count, 2, '.', '');
for ($i = 0; $i < $count; $i++) {
$result[] = $item;
}
if ($isAverage) {
/*防止不能平分*/
if (abs($amount - $item * $count)>=0.001) {
return [];
}
return $result;
}
$pieceCount = intval($amount / 0.01 / $count);
$pieceMoney = $pieceCount * 0.01;
for ($i = 0; $i < $count; $i++) {
$result[$i] = $pieceMoney;
}
$leftMoney = bcsub($amount, $count * $pieceMoney, 2);
$result[$count - 1] = $result[$count - 1] + $leftMoney;
if ($pieceMoney == 0.01) {
//直接返回
return $result;
}
$result = array_map($funPlus, $result);
for ($i = 0; $i < ($count) / 2; $i++) {
$rand = mt_rand(10, $result[$i]);
$temp = $result[$i] - $rand;
//$temp = bcsub($result[$i], $rand, 2);
if ($temp == 0) {
echo "有0了{$rand}<br><br>";
continue;
}
//echo "隨機值$rand<br>";
$result[$i] -= $rand;
//$result[$i] = bcsub($result[$i], $rand, 2);
$result[$count - $i - 1] += $rand;
}
if ($count>6){
// 上面分配的比較平均,來個大點的金額
sort($result);
for ($i=3; $i>1;$i--)
{
$rand = mt_rand(1, $result[$count-$i]);
$temp = $result[$count-$i] - $rand;
if ($temp<0.001){
echo "跳過<br>";
} else {
$result[$count-$i] -= $rand;
$result[$count-1] += $rand;
}
}
/*$rand = mt_rand(1, $result[$count-2]);
$temp = $result[$count-2] - $rand;
if ($temp<0.001){
echo "跳過<br>";
} else {
$result[$count-2] -= $rand;
$result[$count-1] += $rand;
}*/
}
$result = array_map($funDiv, $result);
//shuffle($result);
sort($result);
return $result;
}
結束
歡迎指正調優