简单红包随机算法

简单红包随机算法
给定总额allMoney 随机分成 count 份,要求每份的金额不小于min 不大于max

      /**
     *
     * @param allMoney 总金额
     * @param count  总条数
     * @param min   最小额
     * @param max   最大额
     * @return
     */

    public static List<Integer>  randomAssign(int allMoney,int count,int min,int max){
        List<Integer> list=new ArrayList<>();
        if(allMoney<min*count||allMoney>max*count){
            throw new RuntimeException("不可拆分");
        }
        int money=allMoney-count*min;//剩余可支配金额
        for(int i=0;i<count;i++){
            int one=random(money,count-i,min,max);//随机金额
            list.add(min+one);
            money=money-one;//剩余金额
        }
        Collections.shuffle(list);//随机打乱
        return list;
    }

    /**
     *
     * @param money  剩余分配的金额
     * @param count  剩余份数
     * @return
     */
    public static Integer random(int money,int count,int min,int max){
        if(count==1){//最后一份
            return money;
        }
        //可能存在的最小值
        int m=money-(max-min)*(count-1);//假如其他都是最大值  若m>0  则随机值不能小于m,及最小值是m,最大值不能大于max-min
        int n=0;//随机值
        if(m>0){// m至max-min之间
            n=max-min-m+1;
        }else {
            if(money>max-min){//0至 max-min之间
                m=0;
                n=max-min+1;
            }else{ //0至money之间
                m=0;
                n=money+1;
            }
        }
        return new Random().nextInt(n)+m;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值