@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:记录一下 自己看