zoukankan      html  css  js  c++  java
  • 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;
        }
    
  • 相关阅读:
    查看电脑保存的wifi密码
    数据仓库
    nodejs 中国汉字模糊查询简单(很low)实现
    nodejs express 框架 上传文件
    async样例
    mongodb Map/reduce测试代码
    未释放资源的教训,开发MongoDB连接一定要关闭连接
    采集系统优化:大家接手过的最烂的项目,最坑爹的项目是哪个?
    Android的HttpClient调用,冲突的解决办法
    MongoDBcrud操作,采集部分代码
  • 原文地址:https://www.cnblogs.com/pcx105/p/12145621.html
Copyright © 2011-2022 走看看