int 范围_Java学习之随机生成5个(范围1——33)不同数字的思考

本文探讨了如何在Java中生成5个不重复的随机整数,涉及两种思路:使用boolean数组作为开关和利用Set集合的不可重复特性。通过详细解释这两种方法的实现过程,展示了在遇到特定问题时的解题思维和多样化解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2e28bcfbeb2303c21010da37f3b5868c.png

昨天做了一道福彩双色球的简单程序题,一开始不懂双色球的玩法,楼主我从来不买彩票的,( ╯□╰ )。所以随机生成某个范围的5个数字(数字可以重复),那么很简单,一个循环就可以搞定了,但是那么问题来了,随机生成某个范围的5个不同数字怎么办呢?

左思右想,百度Google,想到以下几种思路:

思路1、使用boolean类型数组作为开关,代码如下:

//传入一个数组,随机生成1——33范围不一样的5个数字
	public static int[] getResult(int[] arr) {
		int[] a = arr;
		//定义34个开关
		boolean[] bool =new boolean[34];//使用默认值false
		for(int i=0;i<arr.length-1;i++) {
			do {
				a[i] =(int)(Math.random()*33)+1;
				
			}while(bool[a[i]]);//如果开关是打开的继续执行
			//打开对应位置的开关
			bool[a[i]]=true;
		}
		return a;
	}

思考步骤:

(0)、传入的int类型数组用来保存这生成的不同的5个数字

(1)、定义一个boolean类型的数组,长度为比生成数字范围大1,因为索引从0开始,而生成的数字是1开始,引用类型对象不初始化的话,属性使用默认值,所以boolean类型数组的每个索引对应位置的默认值为false。

(2)、使用for循环,从int类型数组的索引0开始,循环5次,一次给数值的每个索引所对应的位置赋值。

(3)、for循环里面,会先执行一次do....while循环,先执行一次,再判断条件,条件为boolean类型数组的索引为do....while循环执行一次生成的那个随机数,第一次的时候条件为false肯定是不会再执行的。

(4)、这里是重点,bool[a[i]]=true;它的意思是打开boolean类型数组对应生成的数字为索引的那个位置的开关,fasle变为→true,这样我们下一次执行for循环,执行do......while语句的时候,如果生成的数字和前面第一次的一样的话,那么while条件会为true,则继续执行do....while,直到生成的数字不一样,然后赋值给int类型的数组,然后出了do.....while循环,再将刚才生成的那个数字对应的boolean类型数组的索引所对应的值变为true,也就是打开开关,避免下一次生成重复的数字。

(5)如此,便解决了数字不同的问题。

思路2:使用Set集合,因为Set集合是不允许放入相同的对象的

// 使用Set集合
	public static int[] getResult1(int[] a) {
		// 定义一个数组放入Set集合中取出来的数字
		int[] newArr = a;
		Integer[] arr1= new Integer[5];

		Set<Integer> set = new HashSet<Integer>();
		while (true) {
			set.add((int) ((33) * Math.random() + 1));
			if(set.size()==5) {
			     break;
			}
			}
			for(Integer a:set) {
				System.out.print(a+"t");
			}
			System.out.println();
			//Object[] ob=set.toArray();
			Integer[] m=set.toArray(new Integer[5]);
			for(int i=0;i<m.length;i++) {
			newArr[i]=m[i];//自动拆箱
			}
		return newArr;
	}

思路:定义一个Set集合,定义一个while循环,一直往Set集合添加生成的随机数,因为Set是不允许重复的,所以你添加重复的是添加不进去的,当集合的size等于5的时候就结束while循环,再将集合转换成数组,因为集合中只能放引用类型对象,所以这里的Integer赋值给int类型实际上会自动拆箱。

总结:条条大路通罗马,方法也是多种多样,一题可以有多种解法,当然,这道题还有其他解法,以后再补充吧,虽然不难,但是要经常思考鸭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值