简单实现微信抢红包的功能(Java)

简单实现微信抢红包的功能(Java)

package 数据很美;
import java.util.Random;
import java.util.Scanner;
public class 简单模拟微信抢红包小程序 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		System.out.println("请您输入总金额:");
		double sum=sc.nextDouble();
		System.out.println("请输入红包个数:");
		int people=sc.nextInt();
		start(sum,people);
	}
	private static void start(double sum, int people) {
		double min=0.01;
		Random random=new Random();
		for(int i=1;i<people;i++)
		{
			double max=sum-min*(people-i);
			double bound=max-min;
			double safe=(double)random.nextInt((int) (bound*100))/100;
			double money=safe+min;
			sum=sum-money;
			System.out.println("第"+i+"个红包:"+String.format("%.2f", money)+"元");
		}	
		System.out.println("第"+people+"个红包:"+String.format("%.2f",sum)+"元");
	}
}

这段代码中有几个地方要给大家解释一下:
①:

double min=0.01;

定义这个变量是因为每个红包中最少要有0.01元
②:

double max=sum-min*(people-i);

每一次红包的最大值都是可分配的金额—没有分配到的人数×最小值(每个人至少分配的0.01)
③:

double safe=(double)random.nextInt((int) (bound*100))/100;

因为我发现nextDouble()方法中()里面貌似不能放值所以只能使用nextInt()这个方法,但是他本来就是一个两位小数的值,所以就要先乘100把他变成int类型然后再除100还原double类型即可
简单实现微信抢红包的功能(Java)_第1张图片这个方法没有重载的方法,所以不能在括号里写任何数值
④:

double bound=max-min;

每一次random随机的值的范围都在最小值和最大值之间(min<=bound ⑤:

double money=safe+min;

因为safe出来的值可能为0,所以你要加上他的至少每个包要有的0.01元
⑥:

sum=sum-money;

这里就是下一个循环可分配的钱数等于上一次可分配的钱数减去这一次已经分配的钱数
⑦:

String.format("%.2f", money)

这个方法是将String初始化,小数点后两位输出,其中主要方法如下:
(引用:String.format()使用方法)
简单实现微信抢红包的功能(Java)_第2张图片当然这段代码算法还是太过简单,如果红包分的少还好,但是红包一多就会存在一些问题,比如说:先抢红包的会拿到更多的钱,后拿红包的只能拿到相对更少的钱,如下:
简单实现微信抢红包的功能(Java)_第3张图片简单实现微信抢红包的功能(Java)_第4张图片
简单实现微信抢红包的功能(Java)_第5张图片简单实现微信抢红包的功能(Java)_第6张图片
有什么问题欢迎大家和我一起探讨,相信在探讨中我们会更加理解这段代码,有什么更好的算法也请大家在评论区留言,一起改进问题!

你可能感兴趣的:(简单实现微信抢红包的功能(Java))