int 范围_Java学习之随机生成5个(范围1——33)不同数字的思考
昨天做了一道福彩雙色球的簡單程序題,一開始不懂雙色球的玩法,樓主我從來不買彩票的,( ╯□╰ )。所以隨機生成某個范圍的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類型實際上會自動拆箱。
總結:條條大路通羅馬,方法也是多種多樣,一題可以有多種解法,當然,這道題還有其他解法,以后再補充吧,雖然不難,但是要經常思考鴨。
總結
以上是生活随笔為你收集整理的int 范围_Java学习之随机生成5个(范围1——33)不同数字的思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米 Vela 开源系统正式发布:8KB
- 下一篇: java 最少使用(lru)置换算法_L