红包随机金额

220 阅读1分钟
@Test
public void randomTest() {
    for (int i = 0; i < 100; i++) {
        RedPacketDTO redPacketDTO = new RedPacketDTO();
        //总个数
        redPacketDTO.setSumCount(100);
        //总金额
        redPacketDTO.setSumMoney(100 * 100);
        //剩余金额
        redPacketDTO.setSurplusCount(redPacketDTO.getSumCount());
        //剩余个数
        redPacketDTO.setSurplusMoney(redPacketDTO.getSumMoney());

        while (newRandom(redPacketDTO, shopRed) != null) {
        }
        System.out.println("===================");
    }
    System.out.println("END");
}


/**
 * 商家红包
 */
private final int shopRed = 1;
/**
 * 平台红包
 */
private final int platformRed = 2;

public RedPacketDTO newRandom(RedPacketDTO redPacketDTO, int type) {
    try {
        if (redPacketDTO.getSurplusCount() <= 0) {
            System.out.println("END!");
            return null;
        }
        //初始化数据
        ThreadLocalRandom threadRandom = ThreadLocalRandom.current();
        //总金额
        int sumMoney = redPacketDTO.getSumMoney();
        //总个数
        int sumCount = redPacketDTO.getSumCount();
        //最小金额
        int minMoney = 1;
        //剩余个数
        int count = redPacketDTO.getSurplusCount();
        //剩余金额
        int surplusMoney = redPacketDTO.getSurplusMoney();
        //最大金额
        int maxMoney = (sumMoney - count) / sumCount * 2;
        if (maxMoney > surplusMoney - count) {
            maxMoney = surplusMoney - count;
        }
        //随机金额
        int randomMoney = 0;
        //商家抽红包
        if (shopRed == type) {
            if (maxMoney == minMoney) {
                randomMoney = minMoney;
            } else {
                randomMoney = threadRandom.nextInt(minMoney, maxMoney);
            }
            //如果是最后一次分配剩下所有金额否则还是随机金额
            randomMoney = count == 1 ? surplusMoney : randomMoney;
            //剩余金额=剩余金额-使用金额
            surplusMoney = surplusMoney - randomMoney;
            if (moneyBeyond(surplusMoney)) {
                return null;
            }
            redPacketDTO.setSurplusCount(count - 1);
            //平台抽红包
        } else if (platformRed == type) {
            //平台红包 个数必须是双数
            if (count % platformRed != 0) {
                return null;
            }
            do {
                randomMoney = threadRandom.nextInt(minMoney, maxMoney);
                //剩余金额不够下次随机 在随机一次
            } while ((surplusMoney - 2 * randomMoney) <= count);
            //如果是最后一次分配剩下所有金额否则还是随机金额
            randomMoney = count == 2 ? surplusMoney / 2 : randomMoney;
            //剩余金额=剩余金额-使用金额
            surplusMoney = surplusMoney - randomMoney * 2;
            if (moneyBeyond(surplusMoney)) {
                return null;
            }
            redPacketDTO.setSurplusCount(count - 2);
        }
        redPacketDTO.setSurplusMoney(surplusMoney);
        System.out.print(randomMoney + " ");
        return redPacketDTO;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

private boolean moneyBeyond(Integer surplusMoney) {
    if (surplusMoney < 0) {
        System.out.println("金额分配异常");
        return true;
    }
    return false;

}


实体:




ps:记录一下 自己看