• 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;
        }
    
  • 相关阅读:
    是否可能两个ETH私钥对应同一个地址
    使用 neon-wallet-db + neon-js + NEO-cli /rpc 搭建轻钱包服务端
    从源码看 angular/material2 中 dialog模块 的实现
    个人从源码理解JIT模式下angular编译AppModule的过程
    个人从源码理解angular项目在JIT模式下的启动过程
    使用angular的HttpClient搭配rxjs
    把angular项目整合到.net mvc中
    小程序开发整理
    ABC: Always Be Coding
    postgresql的psql常用命令-4
  • 原文地址:https://www.cnblogs.com/pcx105/p/12145621.html
Copyright © 2020-2023  润新知