控制台编写抢红包

分析

红包的金额分析

第一次分配

将发的钱数分成红包的个数份,并且设置(红包的个数)个随机概率,并且在第二次随机概率产生时,要乘以 1 - (第一次的概率) 才能得到第二次概率、依次推下去,最后一个,就可以直接用 1 - (除最后一个的概率);

第二次分配

因为第一次的分法会导致第一个抢到红包的人占优势,所以会采取第二分配。第二次分配是将已得到的几个概率随机排列组合,打乱顺序,这样就会让第一个抢到红包的人失去优势

如何让几个人抢

这里我会将抢的人定义为一个类,红包的类定义为父类,抢的人定义为子类,在让钱数、红包数、抢的次数、抢到的金额数、红包金额概率为静态变量,这样就能保证其他子类能抢。

代码


//红包类代码
public class User {
	public String name; // 姓名

	public static double money;// 钱数

	public static int num;// 个数

	public static double surplus[];// 钱分成几份的值

	public static double probability[]; // 几分的概率

	public static int frequency;// 第几次抢到红包

	public User() {

	}

	public void probability(int cs) {//红包的金额概率
		double proability = 0;
		if (cs < num) {
			Random r = new Random();
			if (cs == 1) {
				probability[cs - 1] = r.nextDouble(); // 能抢到的发的金额的百分之几
			} else {
				for (int j = 0; j < cs - 1; j++) {
					proability += probability[j];
				}
				probability[cs - 1] = (1 - proability) * r.nextDouble();
			}
		}else{
			for (int j = 0; j < cs - 1; j++) {
				proability += probability[j];
			}
			probability[cs - 1] = 1 - proability;
		}
	}

	public void hair(int num, double money) {//发红包
		this.num = num;
		this.money = money;
		probability = new double[num];
		for (int i = 1; i <= num; i++) {
			probability(i);
		}
		Arrays.sort(probability);
		Random r = new Random();
		int wei = r.nextInt(num - 1);
		double temp;
		for (int i = wei; i < num + wei; i++) {//红包概率重新排序
			if (i < num) {
				temp = probability[i - wei];
				probability[i - wei] = probability[i];
				probability[i] = temp;
			} else {
				for (int j = wei - 1; j >= 0; j--) {
					temp = probability[wei - j];
					probability[wei - j] = probability[j];
					probability[j] = temp;
				}
				break;
			}
		}

	}

	public void strong(String name) {//抢红包

		frequency++;
		if (frequency == 1) {
			surplus = new double[num];
		}

		if (num >= frequency) {
			if (frequency < num) {
				surplus[frequency - 1] = money * probability[frequency - 1];
			} else {
				for (int i = 0; i < num - 1; i++) {
					surplus[num - 1] += surplus[i];
				}
				surplus[num - 1] = money - surplus[num - 1];
				// System.out.println();
			}
			System.out.println(name + "抢到的钱" + surplus[frequency - 1]);
			// 1 5 0.1 0.9 0.2 0.4 0.2 |0.1
		} else {
			System.out.println("红包已抢完");
		}
	}
}

//抢红包用户的类
public class Shou1 extends User{
	
}

//测试类
public static void main(String[] args) {
		Shou1 s1 = new Shou1();
		s1.hair(3, 50);
		s1.strong("s2");
		s1.strong("s1");
		s1.strong("s3");
		s1.strong("s4");
	}

效果图

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值