基于BigDecimal、DecimalFormat、Random实现模拟红包算法
RedPacket 类
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Random;
public class RedPacket {
private String sumMoney;
private int count;
private Random r = new Random();
public RedPacket(String sumMoney, int count) {
super();
this.sumMoney = sumMoney;
this.count = count;
}
public ArrayList<BigDecimal> genPacket() throws RedPacketException{
ArrayList<BigDecimal> list = new ArrayList<>();
BigDecimal money = new BigDecimal("0.01");
double minMoney = money.multiply(new BigDecimal(count)).doubleValue();
BigDecimal totalMoney = new BigDecimal(sumMoney);
if(minMoney > totalMoney.doubleValue()){
throw new RedPacketException("每个红包不能少于0.01元");
}
if(minMoney == totalMoney.doubleValue()) {
for(int i = 0 ; i < count ; i++) {
list.add(new BigDecimal("0.01"));
}
return list;
}
double[] scales = randomScale();
BigDecimal sends = new BigDecimal("0");
for(int i = 0; i < scales.length-1 ; i++) {
money = totalMoney.multiply(new BigDecimal(scales[i])).setScale(2, BigDecimal.ROUND_HALF_EVEN);
sends = sends.add(money);
list.add(money);
}
list.add(totalMoney.subtract(sends));
return list;
}
public double[] randomScale() {
double total = 0;
double[] scales = new double[count];
for (int i = 0; i < count; i++) {
int rint = r.nextInt(100)+1;
scales[i] = rint;
total += rint;
}
for (int i = 0; i < count; i++) {
scales[i] = scales[i] / total;
}
return scales;
}
public static void main(String[] args) throws RedPacketException {
ArrayList<BigDecimal> list = new RedPacket("10", 5).genPacket();
for (BigDecimal bd : list) {
System.out.print(bd + "元\t");
}
}
}
自定义异常 RedPacketException类
public class RedPacketException extends Exception{
public RedPacketException() {
}
public RedPacketException(String message) {
super(message);
}
}