抢红包算法看似简单,实际还是不简单啊!
public static List<Double> getRedPacketList(double money, int num) {
List<Double> redPacketList = new ArrayList<>();
if (num <= 0) {
return null;
}
//先每个红包塞一分钱
for (int i = 0; i < num; i++) {
double base = 0.01;
if (money >= base) {
redPacketList.add(base);
money = BigDecimal.valueOf(money).subtract(BigDecimal.valueOf(base)).doubleValue();
} else {
redPacketList.add(0.0);
}
}
//再随机剩余的金额
for (int i = 0; i < num; i++) {
Double p = redPacketList.get(i);
if (money <= 0) {
break;
} else if (i == num - 1) {
double pp= BigDecimal.valueOf(p).add(BigDecimal.valueOf(money)).doubleValue();
redPacketList.set(i, pp);
} else {
BigDecimal m = BigDecimal.valueOf(money)
.multiply(BigDecimal.valueOf(2))
.divide(BigDecimal.valueOf(num - i), BigDecimal.ROUND_HALF_EVEN)
.multiply(BigDecimal.valueOf(Math.random()))
.setScale(2, BigDecimal.ROUND_HALF_EVEN);
double pp = BigDecimal.valueOf(p).add(m).doubleValue();
redPacketList.set(i, pp);
money = BigDecimal.valueOf(money).subtract(m).doubleValue();
}
}
return redPacketList;
}
网友评论