多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Java實現隨機無重復數字功能

Java實現隨機無重復數字功能

來源:程序員人生   發布時間:2017-02-13 08:24:14 閱讀次數:3661次

學習Java的同學注意了!!! 
學習進程中遇到甚么問題或想獲得學習資源的話,歡迎加入Java學習交換群,群號碼:183993990  我們1起學Java!


  本文給大家介紹如何在JAVA中實現隨機無重復數字的功能。如果您是初學者的話,有必要看1看這篇文章,由于這個功能1般會在面試中遇到。包括我本人在招聘人員的時候也喜歡拿這個問題去問他人,主要看1看斟酌問題的模式和基礎知識如何。
  

  希望這篇文章能給初次接觸的朋友1些幫助,由于我曾接觸過1些朋友要末寫不出來,要末使用很平鋪的思惟方式去實現它。

  1般有點開發經驗的朋友都能實現這樣的功能,只不過是效力上的問題。我們1般在面對這樣的問題時,總會平鋪直序的聯想到,先生成1個數組,然后在1個循環中向數組中添加隨機數字,在添加數字的進程中先查找1下數組中是不是存在這個數字,如果不存在這個數字就直接添加到數組中;如果存在這個數字就不添加。我們1般都是這樣斟酌問題的,這樣斟酌也能實現功能,我剛才也說了,只不過是效力上的問題。

  為了更好地理解這個題意,我們先來看下具體內容:生成1個1⑴00的隨機數組,但數組中的數字不能重復,即位置是隨機的,但數組元素不能重復。

  在這里呢,沒有給我們規定數組的長度,我們可讓它是1⑴00之間的任意長度。

 

  接下來讓我們看1下幾種實現方法并對這幾種方法作個對照。

  通常我們會使用ArrayList或數組來實現,先來看下ArrayList實現進程,以下面代碼所示:

復制代碼
import java.util.ArrayList;
import java.util.Random;

/**
 * 使用ArrayList實現
 * @Description: 

 * @File: Demo.java

 * @Package None

 * @Author Hanyonglu

 * @Date 2012⑴0⑴8 下午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⑴0⑴8 下午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");
            }
        }
    }
}
復制代碼

 

  上面這兩個實現進程效力比較低的。由于在每次添加時都要去遍歷1下當前列表中是不是存在這個數字,時間復雜度是O(N^2)。我們可以這樣思考1下:既然觸及到無重復,我們可以想1下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⑴0⑴8 下午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的集合,只有1個Key的集合,所以也可以使用HashSet來實現,以下代碼:

復制代碼
import java.util.HashSet;
import java.util.Random;

/**
 * 使用HashSet實現
 * @Description: 

 * @File: Test.java

 * @Package None

 * @Author Hanyonglu

 * @Date 2012⑴0⑴8 下午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⑴0⑴8 下午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。有興趣的可以設置下時間查看1下。

 

  固然了,除使用HashMap實現外,還有其它高效的方法。比如,我們可以把1⑴00這些數字存儲在1個數組中,然后在for循環中隨機產生兩個下標,如果這兩個下標不相等的話,可以交換數組中的元素,實現進程以下所示:

復制代碼
import java.util.Random;

/**
 * 隨機調換位置實現
 * @Description: 

 * @File: Demo4.java

 * @Package None

 * @Author Hanyonglu

 * @Date 2012⑴0⑴8 下午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⑴); //隨機產生另外一個位置   
            
            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中實現隨機無重復數字的功能,固然方法也不但限于這么幾種,還有其它的實現方法。希望能對接觸不久的朋友有所幫助,也希望能夠起到拋磚引玉的作用。

學習Java的同學注意了!!! 
學習進程中遇到甚么問題或想獲得學習資源的話,歡迎加入Java學習交換群,群號碼:183993990  我們1起學Java!

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 免费黄网站大全 | 久久狠 | 亚洲精品亚洲人成在线 | 手机看片福利盒子 | 中文字幕 国产精品 | 国产成人啪一区二区 | 2022国产男人亚洲欧美天堂 | 最近中文字幕免费版在线3 最近中文字幕免费大全8高清 | 久久天天躁狠狠躁夜夜中文字幕 | 日本1区2区3区电 | 91精品一区二区三区在线 | 一级做a爰片性色毛片黄书 一级做a爰片性色毛片男 | 欧美啊v在线 | 夜夜嗨视频 | 久久精品全国免费观看国产 | 欧美成人免费高清二区三区 | 免费一区二区三区四区 | 亚洲黄色大全 | 国产精品亚欧美一区二区三区 | 国内视频自拍在线视频 | 久久天天躁狠狠躁夜夜中文字幕 | 欧美激情免费a视频 | 亚洲欧洲日产国码在线观看 | 性猛交xxxxx按摩欧美 | 香蕉在线视频网站 | 热热色国产 | 亚洲欧美精品久久 | 亚洲日本中文 | 欧美一级www | 亚洲免费观看网站 | 99久久精品毛片免费播放 | 窝窝午夜视频 | 最新国产精品亚洲二区 | 另类黄色 | 在线免费视频 | 精品国产高清a毛片 | 国产福利写真视频在线观看 | yellow中文字幕网 | 国产成人高清亚洲一区久久 | 亚洲人成网站999久久久综合 | 亚洲色图欧美一区 |