php 生成隨機紅包

php 紅包隨機功能 最低1分錢

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

結束

歡迎指正調優

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章