JAVA實現隨機無重複數字功能

來源:互聯網
上載者:User

  本文給大家介紹如何在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中實現隨機無重複數位功能,當然方法也不僅限於這麼幾種,還有其它的實現方法。希望能對接觸不久的朋友有所協助,也希望能夠起到拋磚引玉的作用。

  

  樣本下載:/Files/hanyonglu/JAVA/MyTestDemo.rar

 

  最後,希望轉載的朋友能夠尊重作者的勞動成果,加上轉載地址:http://www.cnblogs.com/hanyonglu/archive/2012/10/18/2730007.html 謝謝。

 

  完畢。^_^

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.