微信红包算法

根据个人对微信红包的理解,下午无聊写了一个微信生成红包的方案

设计思路:

1、微信红包,每人最少分得1分钱
2、每人分得到的金额是随机分配的
3、每次生成红包就生成了对应领取红包的结果

/**生成红包的函数*/
function getRandMoney($totalMoney, $totalPeople=2, $miniMoney=1){

        $randRemainMoney = $totalMoney - $totalPeople * $miniMoney;//剩余需要随机的钱数
        return _getRandMoney($randRemainMoney, $totalPeople, $miniMoney);
    }

/**红包生成的逻辑代码*/
function _getRandMoney($totalMoney, $totalPeople, $miniMoney){

        $returnMessage = array('status'=>1, 'data'=>NULL);
        if($totalMoney > 0){
            $returnMessage['data'] = _randMoney($totalMoney, $totalPeople, $miniMoney);
        }elseif($totalMoney == 0){
            $returnMessage['data'] = array_fill(0, $totalPeople, 1);
        }else{
            $returnMessage['status'] = -1;
            $returnMessage['data'] = '参数传递有误,生成红包失败';
        }

        return $returnMessage;
    }

/*参数无误,开始生成对应的红包金额*/
function _randMoney($totalMoney, $totalPeople, $miniMoney){

        $data = array_fill(0, $totalPeople, $miniMoney);
        if($totalPeople > 1){
            foreach($data as $k => $v){
                if($k == $totalPeople -1){
                    $data[$k] = $totalMoney + $v;
                    break;
                }else {
                    if($totalMoney == 0) break;
                    $randMoney = rand(0, $totalMoney);
                    $totalMoney -= $randMoney;
                    $data[$k] = $randMoney + $v;
                }                
            }
        }
        return $data;
    }

生成指定个数的随机红包

<?php
$total=20;//红包总金额   
$num=10;// 分成10个红包,支持10人随机领取   
$min=0.01;//每个人最少能收到0.01元   
 $redpack = new redpack($total,$num,$min);
 $jieguo = $redpack->getPack();
 foreach($jieguo as $key=>$val){
     $n = $key+1;
     echo '第'.$n.'个红包:'.$val['money'].' 元,余额:'.$val['balance'].' 元<br>';   
 }

class redpack{
    //总金额
    private $total=0;
    //红包数量
    private $num=0;
    //最小红包金额
    private $min=0.01;

    public function __construct($total,$num,$min)
    {
        $this->total = $total;
        $this->num = $num;
        $this->min = $min;
    }
    //红包结果
    public function getPack()
    {
        $total = $this->total;
        $num = $this->num;
        $min = $this->min;
        for ($i=1;$i<$num;$i++)   
        {   
            $safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限   
            $money=mt_rand($min*100,$safe_total*100)/100;   
            $total=$total-$money;  
            //红包数据
            $readPack[]= [
                'money'=>$money,
                'balance'=>$total,
            ];
        }
        //最后一个红包,不用随机       
        $readPack[] = [
            'money'=>$money,
            'balance'=>0,
        ];
        //返回结果
        return $readPack;
    }

}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值