简单发红包算法。

来源:互联网 发布:用xcode编写c语言教程 编辑:程序博客网 时间:2024/06/08 10:23

随机分配X个红包,初始版,暂留在这里笔记。。年后再处理,

实际应用中需要结合redis等考虑并发的东西。


<?php/*** */class readPack {    //总金额    public $sumMoney = 0;    //要发的红包个数    public $nums = 0;    //单个最小获得红包    public $min = 0;    //红包数组    public $packArr = [];    //已发放的数量    public $hasAllot = 0;    //已发送的个数    public $hasAllotNums = 0;    function __construct($sumMoney, $nums, $min = 0.01){                $this->sumMoney = $sumMoney;                $this->nums = $nums;        $this->min = $min;    }    //获得单个红包    private function _generateSignPack(){        //剩余未分配的金额        $leftMoney = $this->sumMoney - $this->hasAllot;        //剩余还要发的红包个数        $leftNums = $this->nums - $this->hasAllotNums;        //按最小金额发需要的约包金额        $mustRetain = $leftNums * $this->min;        //最后一个直接得剩余红包        if( $leftNums == 1){            $pack = $leftMoney;        } else {            //如果只能发保底了,就所有人发保底金额            if( $leftMoney <= $mustRetain){                $pack = $this->min;            } else {                //余下的平均数                $avgMoney = $leftMoney/($leftNums);                $signMax = $avgMoney * 2;                $pack = $this->_getRandom($this->min, $signMax);                //有可能这次生成的红包,后面的就不够保底分了。                if( $leftMoney - $mustRetain < $pack ){                    $pack = $this->min;                }            }        }                $this->hasAllot += sprintf('%.2f', $pack);        $this->packArr[] = sprintf('%.2f', $pack);        $this->hasAllotNums++;    }    //分红包    function generatePacks(){        for($i=0; $i<$this->nums; $i++){            $this->_generateSignPack();                    }    }        //生成指定大小的随机数    private function _getRandom($min = 0.01, $max = 1) {        return sprintf('%.2f', $min + mt_rand() / mt_getrandmax() * ($max - $min) );    }}$redPack = new readPack(200000000, 1000000);$redPack->generatePacks();//print_r( $redPack->packArr );echo "红包总金额:{$redPack->sumMoney}\n";echo "生成红包总额:{$redPack->hasAllot}\n";echo "红包总个数:{$redPack->nums}\n";echo "单个最大红包:".max($redPack->packArr)."\n";echo "单个最小红包:".min($redPack->packArr)."\n";




0 0
原创粉丝点击