本文為大家介紹如何在JAVA中實現隨機無重複數字的功能。 (相關影片課程推薦:java影片教學)
為了更好地理解這個題意,我們先來看下具體內容:產生一個1-100的隨機數組,但數組中的數字不能重複,即位置是隨機的,但數組元素不能重複。
在這裡呢,沒有給我們規定數組的長度,我們可以讓它是1-100之間的任意長度。
接下來讓我們來看看幾種實作方法並對這幾種方法作個對比。
通常我們會使用ArrayList或陣列來實現,先來看下ArrayList實作過程,如下面程式碼所示:
import java.util.ArrayList; import java.util.Random; /** * 使用ArrayList实现 * @Description: * @File: Demo.java * @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"); } } } }
以上幾種相比較而言,使用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"); } } } }
更多java相關文章請追蹤java基礎教學。
以上是java產生不重複的隨機數方法總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!