java隨機抽取指定規模不反復的數字。本站提示廣大學習愛好者:(java隨機抽取指定規模不反復的數字)文章只能為提供參考,不一定能成為您想要的結果。以下是java隨機抽取指定規模不反復的數字正文
本文給年夜家引見若何在JAVA中完成隨機無反復數字的功效。假如您是初學者的話,有需要看一看這篇文章,由於這個功效普通會在面試中碰到。包含我自己在雇用人員的時刻也愛好拿這個成績去問他人,重要看一看斟酌成績的形式和基本常識若何。
願望這篇文章能給首次接觸的同伙一些贊助,由於我曾接觸過一些同伙要末寫不出來,要末應用很平鋪的思想方法去完成它。
普通有點開辟經歷的同伙都能完成如許的功效,只不外是效力上的成績。我們普通在面臨如許的成績時,總會平鋪直序的聯想到,師長教師成一個數組,然後在一個輪回中向數組中添加隨機數字,在添加數字的進程中先查找一下數組中能否存在這個數字,假如不存在這個數字就直接添加到數組中;假如存在這個數字就不添加。我們普通都是如許斟酌成績的,如許斟酌也能完成功效,我適才也說了,只不外是效力上的成績。
為了更好地輿解這個題意,我們先來看下詳細內容:生成一個1-100的隨機數組,但數組中的數字不克不及反復,即地位是隨機的,但數組元素不克不及反復。
在這裡呢,沒有給我們劃定數組的長度,我們可讓它是1-100之間的隨意率性長度。
接上去讓我們看一下幾種完成辦法並對這幾種辦法作個比較。
平日我們會應用ArrayList或數組來完成,先來看下ArrayList完成進程,以下面代碼所示:
import java.util.ArrayList; import java.util.Random; /** * 應用ArrayList完成 * @Description: * @File: Demo.java * @Package None * @Author Hanyonglu * @Date 2012-10-18 下晝06:16:55 * @Version V1.0 */ public class Demo { public static void main(String[] args) { Object[] values = new Object[20]; Random random = new Random(); ArrayList<Integer> list = new ArrayList<Integer>(); for(int i = 0; i < values.length;i++){ int number = random.nextInt(100) + 1; if(!list.contains(number)){ list.add(number); } } values = list.toArray(); // 遍歷數組並打印數據 for(int i = 0;i < values.length;i++){ System.out.print(values[i] + "\t"); if(( i + 1 ) % 10 == 0){ System.out.println("\n"); } } } }
應用數組完成的進程以下所示代碼:
import java.util.Random; /** * 應用數組完成 * @Description: * @File: Demo4.java * @Package None * @Author Hanyonglu * @Date 2012-10-18 下晝06:27:38 * @Version V1.0 */ public class Demo4 { public static void main(String[] args) { int[] values = new int[20]; Random random = new Random(); for(int i = 0;i < values.length;i++){ int number = random.nextInt(100) + 1; for(int j = 0;j <= i;j++){ if(number != values[j]){ values[i]=number; } } } // 遍歷數組並打印數據 for(int i = 0;i < values.length;i++){ System.out.print(values[i] + "\t"); if(( i + 1 ) % 10 == 0){ System.out.println("\n"); } } } }
下面這兩個完成進程效力比擬低的。由於在每次添加時都要去遍歷一下以後列表中能否存在這個數字,時光龐雜度是O(N^2)。我們可以如許思慮一下:既然觸及到無反復,我們可以想一下HashSet和HashMap的功效。HashSet完成Set接口,Set在數學上的界說就是無反復,無順序的聚集。而HashMap完成Map,也是不許可反復的Key。如許我們可使用HashMap或HashSet來完成。
在應用HashMap完成時,只須要將它的key轉化成數組就Ok了,以下代碼:
import java.util.HashMap; import java.util.Iterator; import java.util.Random; import java.util.Map.Entry; /** * 應用HashMap完成 * @Description: * @File: Demo.java * @Package None * @Author Hanyonglu * @Date 2012-10-18 下晝06:12:50 * @Version V1.0 */ public class Demo { public static void main(String[] args) { int n = 0; Object[] values = new Object[20]; Random random = new Random(); HashMap<Object, Object> hashMap = new HashMap<Object, Object>(); // 生成隨機數字並存入HashMap for(int i = 0;i < values.length;i++){ int number = random.nextInt(100) + 1; hashMap.put(number, i); } // 從HashMap導入數組 values = hashMap.keySet().toArray(); // 遍歷數組並打印數據 for(int i = 0;i < values.length;i++){ System.out.print(values[i] + "\t"); if(( i + 1 ) % 10 == 0){ System.out.println("\n"); } } // Iterator iter = hashMap.entrySet().iterator(); // // 遍歷HashMap // while (iter.hasNext()) { // Entry<Integer, Integer> entry = (Entry)iter.next(); // int key = entry.getKey(); // n++; // // System.out.print(key + "\t"); // // if(n % 10 == 0){ // System.out.println("\n"); // } // } } }
因為HashSet和HashMap的關系太近了,HashSet在底層就是用HashMap來完成的,只不外沒有Value的聚集,只要一個Key的聚集,所以也可以使用HashSet來完成,以下代碼:
import java.util.HashSet; import java.util.Random; /** * 應用HashSet完成 * @Description: * @File: Test.java * @Package None * @Author Hanyonglu * @Date 2012-10-18 下晝06:11:41 * @Version V1.0 */ public class Test { public static void main(String[] args) { Random random = new Random(); Object[] values = new Object[20]; HashSet<Integer> hashSet = new HashSet<Integer>(); // 生成隨機數字並存入HashSet for(int i = 0;i < values.length;i++){ int number = random.nextInt(100) + 1; hashSet.add(number); } values = hashSet.toArray(); // 遍歷數組並打印數據 for(int i = 0;i < values.length;i++){ System.out.print(values[i] + "\t"); if(( i + 1 ) % 10 == 0){ System.out.println("\n"); } } } }
如許完成效力略微好些。假如給我們限制了數組的長度,只須要變換下for輪回,設置成whlie輪回便可以了。以下所示:
import java.util.HashSet; import java.util.Random; /** * 應用HashSet完成 * @Description: * @File: Test.java * @Package None * @Author Hanyonglu * @Date 2012-10-18 下晝05:11:41 * @Version V1.0 */ public class Test { public static void main(String[] args) { Random random = new Random(); Object[] values = new Object[20]; HashSet<Integer> hashSet = new HashSet<Integer>(); // 生成隨機數字並存入HashSet while(hashSet.size() < values.length){ hashSet.add(random.nextInt(100) + 1); } values = hashSet.toArray(); // 遍歷數組並打印數據 for(int i = 0;i < values.length;i++){ System.out.print(values[i] + "\t"); if(( i + 1 ) % 10 == 0){ System.out.println("\n"); } } } }
我們可以把數組的長度設置成100,磨練下運轉後果,以下圖所示:
以上幾種比擬較而言,應用HashMap的效力是比擬高的,實際上是HashSet,再次是數組,最初是ArrayList。假如我們生成10000個數據將會發明,應用HashMap消費時光是:0.05s,HashSet是0.07s,數組是:0.20s,而ArrayList是0.25s。有興致的可以設置下時光檢查一下。
固然了,除應用HashMap完成外,還有其它高效的辦法。好比,我們可以把1-100這些數字存儲在一個數組中,然後在for輪回中隨機發生兩個下標,假如這兩個下標不相等的話,可以交流數組中的元素,完成進程以下所示:
import java.util.Random; /** * 隨機更換地位完成 * @Description: * @File: Demo4.java * @Package None * @Author Hanyonglu * @Date 2012-10-18 下晝06:54:06 * @Version V1.0 */ public class Demo4 { public static void main(String[] args) { int values[] = new int[100]; int temp1,temp2,temp3; Random r = new Random(); for(int i = 0;i < values.length;i++){ values[i] = i + 1; } //隨機交流values.length次 for(int i = 0;i < values.length;i++){ temp1 = Math.abs(r.nextInt()) % (values.length-1); //隨機發生一個地位 temp2 = Math.abs(r.nextInt()) % (values.length-1); //隨機發生另外一個地位 if(temp1 != temp2){ temp3 = values[temp1]; values[temp1] = values[temp2]; values[temp2] = temp3; } } // 遍歷數組並打印數據 for(int i = 0;i < 20;i++){ System.out.print(values[i] + "\t"); if(( i + 1 ) % 10 == 0){ System.out.println("\n"); } } } }
這類辦法也是比擬高效的,假如生成10000個數據,那末它所用的時光是0.054s。
在數組中應用坐標來完成的基本上可以變換更多相干的處理辦法,詳細地可以查閱相干材料。
以上是關於在JAVA中完成隨機無反復數字的功效,固然辦法也不只限於這麼幾種,還有其它的完成辦法。願望能對接觸不久的同伙有所贊助,也願望可以或許起到拋磚引玉的感化。
原文網址:http://www.cnblogs.com/hanyonglu/archive/2012/10/18/2730007.html
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。