本方法的原理是:
得知红包总数和红包总金额后,先求出平均值,利用random方法生成数量为(红包总数-1)个金额小于平均值的红包,剩下最后一个红包的金额就是总金额减去前面所有之和。
测试
:
源码:
public class RedPcket {
public double[] redPac(double sum,double num) {
Random random = new Random();
BigDecimal a = new BigDecimal("0.01");
BigDecimal aa = new BigDecimal(sum);
BigDecimal b = new BigDecimal(sum/num);
BigDecimal sumd = new BigDecimal("0");
//BigDecimal[] dd = new BigDecimal[(int) num];
double[] dd = new double[(int) num];
for(int i = 0;i < num-1;i++) {
double ddd = random.nextDouble();
BigDecimal d = new BigDecimal(ddd);
BigDecimal d1 = b.multiply(d);
BigDecimal d2 = d1.add(a);
double result = d2.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();//用于生成金额保留两位小数
dd[i] = result;
sumd =sumd.add(d2);
}
dd[(int) (num-1)] = aa.subtract(sumd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
return dd;
}
public static void main(String[] args) {
RedPcket redPcket = new RedPcket();
Scanner scanner = new Scanner(System.in);
double sum;
double num;
System.out.println("输入红包个数:");
num = scanner.nextDouble();
System.out.println("输入红包总额:");
sum = scanner.nextDouble();
//BigDecimal[] bb = redPcket.redPac(sum, num);
double[] newArr = redPcket.redPac(sum, num);
for(int i = 0;i < num;i++ ) {
System.out.println("第"+(i+1)+"个人抢到的金额是"+newArr[i]);
}
System.out.println("运气王是"+newArr[(int) (num-1)]+"元");
}
}