• 红包派送逻辑代码


    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;
        }
    }
    

     

  • 相关阅读:
    GIS前端编程-Leaflet插件扩展
    代码随想录训练营 DP
    关于C#程序(Windows窗体应用)的退出询问
    什么是数据标注?
    你的数据库到底应该如何存储密码?
    红海云荣膺「2023智享会人力资源技术供应商价值大奖」
    教你一文解决 js 数字精度丢失问题
    java 下载文件名 编码
    人工神经网络理论及应用pdf,人工智能的相关书籍
    PostgreSQL VACUUM 之深入浅出 (一)
  • 原文地址:https://blog.csdn.net/qq_33580952/article/details/127827876