package com.dbtest.test;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
/**
* @author Lizf on 2022/11/12.
*/
public class RedPacket {
/**
* 单个红包最大倍数
*/
private static int MAX = 2;
/**
* 单个红包最小数额
*/
private static double MIN = 0.01;
/**
* 金额保留位数
*/
private static DecimalFormat DECIMAL_FORMAT = new DecimalFormat(".00");
public static void main(String[] args) {
//金额
double amount;
//个数
int number;
//平均数
double avg;
Scanner scanner = new Scanner(System.in);
System.out.print("红包金额:");
amount = scanner.nextDouble();
System.out.print("红包个数:");
number = scanner.nextInt();
if ( number == 1 ) {
System.out.println("¥:"+amount);
return;
}
//平均数
avg = amount/number;
if ( avg < MIN) {
System.out.print("最少也要给一人一分吧!");
return;
}
String str = DECIMAL_FORMAT.format(avg);
avg = Float.parseFloat(str);
List redPacket;
while (true) {
//生成红包
List generateList = generate(number,avg);
//校验红包
redPacket = check(generateList,amount,number);
//生成红包大于总金额重新生成
if( redPacket.size() > 0) {
break;
}
}
redPacket.forEach( e -> {
System.out.println("¥:"+e);
});
}
/**
* 生成红包
* @param number
* @param avg
* @return
*/
private static List generate(double number, double avg) {
List list = new ArrayList<>();
for ( int i = 0; i < number; i++) {
double result = (avg * Math.random()) * 2;
//不在规则内, 重新生成
while (result >= (avg * MAX) || result < MIN) {
result = (avg * Math.random()) * 2;
}
list.add(Double.parseDouble(DECIMAL_FORMAT.format(result)));
}
return list;
}
/**
* 校验红包
* @param list
* @param amount
* @param number
* @return
*/
private static List check(List list, double amount, int number) {
List resultList = new ArrayList<>();
double total = 0;
for (double d: list){
total += d;
}
if ( total == amount ) {
resultList = list;
}
//生成红包小于总金额
if ( total < amount) {
double sub = amount - total;
int index = new Random().nextInt(number);
for( int i = 0; i < number; i++){
if( i == index) {
//多出来的随机指定到一个红包内
double newIndex = Double.parseDouble(DECIMAL_FORMAT.format(list.get(i)+sub));
resultList.add(newIndex);
} else {
resultList.add(list.get(i));
}
}
}
return resultList;
}
}
