Java 小白 微信抢红包小程序(详细)

package red;

import java.util.Random;
import java.util.Scanner;

class Program
{
    public static void main(String[] args)
    {
        System.out.println("------模拟微信抢红包------\n");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入总金额");
        double Total = sc.nextDouble();
        System.out.println("请输入红包个数");
         int Red = sc.nextInt();
        double min = 0.01;//设置最小金额
        Random random = new Random();//创造随机数
        if (Total/Red==0.01)
        {
            for (int i = 1;i <= Red;i++)
            {
                double money = min; //设置每个红包都是0.01;
                System.out.println("第"+i+"个红包"+String.format("%.2f",money)+"元");
            }
        }else if (Total/Red < 0.01) //当金额除以个数小于0.01时
        {
            System.out.println("每个人至少要走0.01分");
        }else
        {
            for (int i = 1;i <= Red;i++)
            {
                double max = Total - (Red -i)*min; //红包的最大值 = 余下的金额 减去(总红包减去以及发送的红包)*最小金额
                double bound = max -min; //每一次random随机的值的范围都在最小值和最大值之间(min<=bound<max)
                double safe=(double)random.nextInt((int) (bound*100))/100;//整数值转化为double
                double money = safe + min;//safe出来的值可能为0,每个包要有的0.01元
                Total = Total-money;//这里就是下一个循环可分配的钱数等于上一次可分配的钱数减去这一次已经分配的钱数
                System.out.println("第"+i+"个红包:"+String.format("%.2f", money)+"元");
            }
        }
    }
}

优化之后

package red;

import java.util.Random;
import java.util.Scanner;

class Program
{
    public static void main(String[] args)
    {
        System.out.println("------模拟微信抢红包------\n");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入总金额");
        double Total = sc.nextDouble();
        System.out.println("请输入红包个数");
        int Red = sc.nextInt();
        double min = 0.01;//设置最小金额
        Random random = new Random();//创造随机数
        double left = Total;//余下的金额
        double avg = Total / Red; //平均数
        for (int i = 1; i < Red; i++)
        {
            int j = Red - i;//剩下的红包
            double max = left - j * min; // 红包的最大值 = 余下的金额 减去(总红包减去以及发送的红包)*最小金额
            double safe = random.nextDouble() * max;// 整数值转化为double
            while (j > 0)
            {
                if (safe >avg)
                {
                    safe = random.nextDouble() * max;
                }else
                    {
                    break;
                }
                j--;
            }
            // System.out.println(safe);
            if (safe <= 0.01)
                safe = 0.01;
            // double money = safe + min;//safe出来的值可能为0,每个包要有的0.01元
            left = left - safe;// 这里就是下一个循环可分配的钱数等于上一次可分配的钱数减去这一次已经分配的钱数
            System.out.println("第" + i + "个红包:\t" + String.format("%.2f", safe) + "\t元");
        }
        System.out.println("第" + Red + "个红包:\t" + String.format("%.2f", left) + "\t元");
    }
}

版权声明:本文为Lin_bai_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。