public $bonus;//紅包
public $bonusNum;//紅包個數
public $bonusMoney;//紅包總金額
public $moneySingleMax;//單個紅包最大限制
public $moneySingleMin;//單個紅包最小限制
/**
* redPackageService constructor.
* @param int $bonusNum
* @param int $bonusMoney
*/
public function __construct($bonusNum = 20, $bonusMoney = 200)
{
$avg = ceil($bonusMoney / $bonusNum);
$avgHalf = ceil($avg / 2);
$this->bonusNum = $bonusNum;
$this->bonusMoney = $bonusMoney;
$this->moneySingleMax = $avg + $avgHalf;
$this->moneySingleMin = $avg - $avgHalf;
}
private function randomFloat($min = 0, $max = 1)
{
$mtRand = mt_rand();
$mtGetRandMax = mt_getrandmax();
return $min + $mtRand / $mtGetRandMax * ($max - $min);
}
//計算
public function compute()
{
$this->bonus = array();
$bonusMoneyTemp = $this->bonusMoney;
$moneySingleMax = $this->moneySingleMax;
$moneySingleMin = $this->moneySingleMin;
$i = 1;
while ($i < $this->bonusNum) {
if ($moneySingleMax > $bonusMoneyTemp) {
$moneySingleMax = floatval(sprintf("%01.2f", $bonusMoneyTemp / 2));//剩余金額不夠分時,把剩余金額的一半作為備用金
if ($moneySingleMin > $moneySingleMax) { //最小金額大於最大金額時,將最小金額設置為最大金額的一半
$moneySingleMin = floatval(sprintf("%01.2f", $moneySingleMax / 2));
}
}
$bonusMoneyRad = $this->randomFloat($moneySingleMin, $moneySingleMax);//一個紅包隨機金額
$bonusMoneyRad = floatval(sprintf("%01.2f", $bonusMoneyRad));
$bonusMoneyTemp = $bonusMoneyTemp - $bonusMoneyRad;//待分配的總剩余金額
$bonusMoneyTemp = floatval(sprintf("%01.2f", $bonusMoneyTemp));
$this->bonus[] = $bonusMoneyRad;
$i++;
}
$this->bonus[] = $bonusMoneyTemp;//分配剩余金額給最后一個紅包
}
//打印
public function output()
{
$total = 0;
foreach ($this->bonus as $k => $v) {
echo '紅包' . ($k + 1) . '=' . $v . '<br/>';
$total += $v;
}
echo '紅包總金額:' . $total;
}