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; }