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<Double> redPacket; while (true) { //生成红包 List<Double> 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<Double> generate(double number, double avg) { List<Double> 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<Double> check(List<Double> list, double amount, int number) { List<Double> 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; } }