简单红包随机算法
给定总额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;
    }
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐