php 實現紅包算法


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM