int 范围_Java学习之随机生成5个(范围1——33)不同数字的思考
昨天做了一道福彩雙色球的簡(jiǎn)單程序題,一開(kāi)始不懂雙色球的玩法,樓主我從來(lái)不買(mǎi)彩票的,( ╯□╰ )。所以隨機(jī)生成某個(gè)范圍的5個(gè)數(shù)字(數(shù)字可以重復(fù)),那么很簡(jiǎn)單,一個(gè)循環(huán)就可以搞定了,但是那么問(wèn)題來(lái)了,隨機(jī)生成某個(gè)范圍的5個(gè)不同數(shù)字怎么辦呢?
左思右想,百度Google,想到以下幾種思路:
思路1、使用boolean類(lèi)型數(shù)組作為開(kāi)關(guān),代碼如下:
//傳入一個(gè)數(shù)組,隨機(jī)生成1——33范圍不一樣的5個(gè)數(shù)字public static int[] getResult(int[] arr) {int[] a = arr;//定義34個(gè)開(kāi)關(guān)boolean[] bool =new boolean[34];//使用默認(rèn)值falsefor(int i=0;i<arr.length-1;i++) {do {a[i] =(int)(Math.random()*33)+1;}while(bool[a[i]]);//如果開(kāi)關(guān)是打開(kāi)的繼續(xù)執(zhí)行//打開(kāi)對(duì)應(yīng)位置的開(kāi)關(guān)bool[a[i]]=true;}return a;}思考步驟:
(0)、傳入的int類(lèi)型數(shù)組用來(lái)保存這生成的不同的5個(gè)數(shù)字
(1)、定義一個(gè)boolean類(lèi)型的數(shù)組,長(zhǎng)度為比生成數(shù)字范圍大1,因?yàn)樗饕龔?開(kāi)始,而生成的數(shù)字是1開(kāi)始,引用類(lèi)型對(duì)象不初始化的話(huà),屬性使用默認(rèn)值,所以boolean類(lèi)型數(shù)組的每個(gè)索引對(duì)應(yīng)位置的默認(rèn)值為false。
(2)、使用for循環(huán),從int類(lèi)型數(shù)組的索引0開(kāi)始,循環(huán)5次,一次給數(shù)值的每個(gè)索引所對(duì)應(yīng)的位置賦值。
(3)、for循環(huán)里面,會(huì)先執(zhí)行一次do....while循環(huán),先執(zhí)行一次,再判斷條件,條件為boolean類(lèi)型數(shù)組的索引為do....while循環(huán)執(zhí)行一次生成的那個(gè)隨機(jī)數(shù),第一次的時(shí)候條件為false肯定是不會(huì)再執(zhí)行的。
(4)、這里是重點(diǎn),bool[a[i]]=true;它的意思是打開(kāi)boolean類(lèi)型數(shù)組對(duì)應(yīng)生成的數(shù)字為索引的那個(gè)位置的開(kāi)關(guān),fasle變?yōu)椤鷗rue,這樣我們下一次執(zhí)行for循環(huán),執(zhí)行do......while語(yǔ)句的時(shí)候,如果生成的數(shù)字和前面第一次的一樣的話(huà),那么while條件會(huì)為true,則繼續(xù)執(zhí)行do....while,直到生成的數(shù)字不一樣,然后賦值給int類(lèi)型的數(shù)組,然后出了do.....while循環(huán),再將剛才生成的那個(gè)數(shù)字對(duì)應(yīng)的boolean類(lèi)型數(shù)組的索引所對(duì)應(yīng)的值變?yōu)閠rue,也就是打開(kāi)開(kāi)關(guān),避免下一次生成重復(fù)的數(shù)字。
(5)如此,便解決了數(shù)字不同的問(wèn)題。
思路2:使用Set集合,因?yàn)镾et集合是不允許放入相同的對(duì)象的
// 使用Set集合public static int[] getResult1(int[] a) {// 定義一個(gè)數(shù)組放入Set集合中取出來(lái)的數(shù)字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];//自動(dòng)拆箱}return newArr;}思路:定義一個(gè)Set集合,定義一個(gè)while循環(huán),一直往Set集合添加生成的隨機(jī)數(shù),因?yàn)镾et是不允許重復(fù)的,所以你添加重復(fù)的是添加不進(jìn)去的,當(dāng)集合的size等于5的時(shí)候就結(jié)束while循環(huán),再將集合轉(zhuǎn)換成數(shù)組,因?yàn)榧现兄荒芊乓妙?lèi)型對(duì)象,所以這里的Integer賦值給int類(lèi)型實(shí)際上會(huì)自動(dòng)拆箱。
總結(jié):條條大路通羅馬,方法也是多種多樣,一題可以有多種解法,當(dāng)然,這道題還有其他解法,以后再補(bǔ)充吧,雖然不難,但是要經(jīng)常思考鴨。
總結(jié)
以上是生活随笔為你收集整理的int 范围_Java学习之随机生成5个(范围1——33)不同数字的思考的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 小米 Vela 开源系统正式发布:8KB
- 下一篇: java 最少使用(lru)置换算法_L