
昨天做了一道福彩双色球的简单程序题,一开始不懂双色球的玩法,楼主我从来不买彩票的,( ╯□╰ )。所以随机生成某个范围的5个数字(数字可以重复),那么很简单,一个循环就可以搞定了,但是那么问题来了,随机生成某个范围的5个不同数字怎么办呢?
左思右想,百度Google,想到以下几种思路:
思路1、使用boolean类型数组作为开关,代码如下:
//传入一个数组,随机生成1——33范围不一样的5个数字public static int[] getResult(int[] arr) {int[] a = arr;//定义34个开关boolean[] bool =new boolean[34];//使用默认值falsefor(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类型实际上会自动拆箱。
总结:条条大路通罗马,方法也是多种多样,一题可以有多种解法,当然,这道题还有其他解法,以后再补充吧,虽然不难,但是要经常思考鸭。