java 抢红包算法

算法 思路: 
设mm为数额,单位为元
m=mm*100,
m=m-num;
从m范围内取m1,
m=m-m1+1,
从m范围内取m2
m=m-m2+1
以此类推....
然后再累加所有切分的数额,与最初的数额比较,
相等则结束,不相等则将差额加入数组最后一个。
打乱数组。

/**
     * 递归切分红包
     * @param mm 红包金额,以分为单位
     * @param number 红包个数
     * @return
     */
    public List cutPack(BigDecimal mm,int number){
        List rtnList = new ArrayList();
        Random random = new Random();
        int m = mm.intValue()-number;
        if(m<=0){
            for (int i = 0; i < number; i++) {
                rtnList.add(BigDecimal.ONE);
            }
        }else{
            int r = random.nextInt(99) + 1;
            int mn = m*r/100;
            if(mn<1){
                mn = 1;
            }
            rtnList.add(BigDecimal.valueOf(mn));
            m = m-mn+number-1;
            rtnList.addAll(cutPack(BigDecimal.valueOf(m), number - rtnList.size()));
        }

        return rtnList;
    }

    /**
     * 切分所有红包
     * @param mm 红包金额,以分为单位
     * @param number 红包个数
     * @return
     */
    public List cutPackAll(BigDecimal mm,int number){
        List rtnList = new ArrayList();
        List moneys = cutPack(mm, number);
        if (moneys != null) {
            BigDecimal b = new BigDecimal(0);
            for (BigDecimal bigDecimal : moneys) {
                b = b.add(bigDecimal);
            }
            //检查已切分的红包总额是否=红包金额,不等于时,剩余金额直接分配给最后一个
            if(b.intValue()


测试调用:

@Test
    public void test_math(){
        for (int i = 0; i < 5; i++) {
            List moneys = cutPackAll(BigDecimal.valueOf(11), 10);
            if (moneys != null) {
                BigDecimal b = new BigDecimal(0);
                for (BigDecimal bigDecimal : moneys) {
                    System.out.print(bigDecimal + "元    ");
                    b = b.add(bigDecimal);
                }
                System.out.print("   总额:" + b+"元 ");
                System.out.println();
            }
        }
    }


测试结果:

0.01元    0.01元    0.01元    0.01元    0.01元    0.01元    0.01元    0.01元    0.01元    0.02元       总额:0.11元 
0.02元    0.01元    0.01元    0.01元    0.01元    0.01元    0.01元    0.01元    0.01元    0.01元       总额:0.11元 
0.01元    0.01元    0.01元    0.01元    0.01元    0.01元    0.01元    0.02元    0.01元    0.01元       总额:0.11元 
0.01元    0.01元    0.01元    0.01元    0.01元    0.01元    0.01元    0.01元    0.02元    0.01元       总额:0.11元 
0.01元    0.01元    0.01元    0.01元    0.01元    0.02元    0.01元    0.01元    0.01元    0.01元       总额:0.11元 





你可能感兴趣的:(java)