黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) hot資訊 Java不重復(fù)隨機(jī)數(shù)的生成方法總結(jié)

Java不重復(fù)隨機(jī)數(shù)的生成方法總結(jié)

更新時(shí)間:2021-05-14 10:58:20 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1366次

為了更好地理解這個(gè)題意,我們先來(lái)看下具體內(nèi)容:生成一個(gè)1-100的隨機(jī)數(shù)組,但數(shù)組中的數(shù)字不能重復(fù),即位置是隨機(jī)的,但數(shù)組元素不能重復(fù)。

在這里呢,沒(méi)有給我們規(guī)定數(shù)組的長(zhǎng)度,我們可以讓它是1-100之間的任意長(zhǎng)度。

接下來(lái)讓我們看一下幾種實(shí)現(xiàn)方法并對(duì)這幾種方法作個(gè)對(duì)比。

通常我們會(huì)使用ArrayList或數(shù)組來(lái)實(shí)現(xiàn),先來(lái)看下ArrayList實(shí)現(xiàn)過(guò)程,如下面代碼所示:

import java.util.ArrayList;
import java.util.Random;
/**
 * 使用ArrayList實(shí)現(xiàn)
 * @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 list = new ArrayList(); 
        for(int i = 0; i < values.length;i++){
            int number = random.nextInt(100) + 1;             
            if(!list.contains(number)){
                list.add(number);
            }
        }         
        values = list.toArray();         
        // 遍歷數(shù)組并打印數(shù)據(jù)
        for(int i = 0;i < values.length;i++){
            System.out.print(values[i] + "\t");            
            if(( i + 1 ) % 10 == 0){
                System.out.println("\n");
            }
        }
    }
}

使用數(shù)組實(shí)現(xiàn)的過(guò)程如下所示代碼:

import java.util.Random; 
/**
 * 使用數(shù)組實(shí)現(xiàn)
 * @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;
                }                             
            }
        }        
        // 遍歷數(shù)組并打印數(shù)據(jù)
        for(int i = 0;i < values.length;i++){
            System.out.print(values[i] + "\t");             
            if(( i + 1 ) % 10 == 0){
                System.out.println("\n");
            }
        }
    }
}

上面這兩個(gè)實(shí)現(xiàn)過(guò)程效率比較低的。因?yàn)樵诿看翁砑訒r(shí)都要去遍歷一下當(dāng)前列表中是否存在這個(gè)數(shù)字,時(shí)間復(fù)雜度是O(N^2)。我們可以這樣思考一下:既然涉及到無(wú)重復(fù),我們可以想一下HashSet和HashMap的功能。

HashSet實(shí)現(xiàn)Set接口,Set在數(shù)學(xué)上的定義就是無(wú)重復(fù),無(wú)次序的集合。而HashMap實(shí)現(xiàn)Map,也是不允許重復(fù)的Key。這樣我們可以使用HashMap或HashSet來(lái)實(shí)現(xiàn)。

在使用HashMap實(shí)現(xiàn)時(shí),只需要將它的key轉(zhuǎn)化成數(shù)組就Ok了,如下代碼:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Random;
import java.util.Map.Entry; 
/**
 * 使用HashMap實(shí)現(xiàn)
 * @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 hashMap = new HashMap();
        // 生成隨機(jī)數(shù)字并存入HashMap
        for(int i = 0;i < values.length;i++){
            int number = random.nextInt(100) + 1;
            hashMap.put(number, i);
        }
        // 從HashMap導(dǎo)入數(shù)組
        values = hashMap.keySet().toArray();
        // 遍歷數(shù)組并打印數(shù)據(jù)
        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 entry = (Entry)iter.next();
//            int key = entry.getKey();
//            n++;
//           
//            System.out.print(key + "\t");
//           
//            if(n % 10 == 0){
//                System.out.println("\n");
//            }
//        }
    }
}

由于HashSet和HashMap的關(guān)系太近了,HashSet在底層就是用HashMap來(lái)實(shí)現(xiàn)的,只不過(guò)沒(méi)有Value的集合,只有一個(gè)Key的集合,所以也可使用HashSet來(lái)實(shí)現(xiàn),如下代碼:

import java.util.HashSet;
import java.util.Random;
/**
 * 使用HashSet實(shí)現(xiàn)
 * @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 hashSet = new HashSet();
        // 生成隨機(jī)數(shù)字并存入HashSet
        for(int i = 0;i < values.length;i++){
            int number = random.nextInt(100) + 1;
            hashSet.add(number);
        }         
        values = hashSet.toArray();        
        // 遍歷數(shù)組并打印數(shù)據(jù)
        for(int i = 0;i < values.length;i++){
            System.out.print(values[i] + "\t");
            if(( i + 1 ) % 10 == 0){
                System.out.println("\n");
            }
        }
    }
}

這樣實(shí)現(xiàn)效率稍微好些。如果給我們限定了數(shù)組的長(zhǎng)度,只需要變換下for循環(huán),設(shè)置成whlie循環(huán)就可以了。如下所示:

import java.util.HashSet;
import java.util.Random;
/**
 * 使用HashSet實(shí)現(xiàn)
 * @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 hashSet = new HashSet();
        // 生成隨機(jī)數(shù)字并存入HashSet
        while(hashSet.size() < values.length){
            hashSet.add(random.nextInt(100) + 1);
        }
        values = hashSet.toArray();
        // 遍歷數(shù)組并打印數(shù)據(jù)
        for(int i = 0;i < values.length;i++){
            System.out.print(values[i] + "\t");
            if(( i + 1 ) % 10 == 0){
                System.out.println("\n");
            }
        }
    }
}

以上幾種相比較而言,使用HashMap的效率是比較高的,其實(shí)是HashSet,再次是數(shù)組,最后是ArrayList。如果我們生成10000個(gè)數(shù)據(jù)將會(huì)發(fā)現(xiàn),使用HashMap花費(fèi)時(shí)間是:0.05s,HashSet是0.07s,數(shù)組是:0.20s,而ArrayList是0.25s。有興趣的可以設(shè)置下時(shí)間查看一下。

當(dāng)然了,除了使用HashMap實(shí)現(xiàn)外,還有其它高效的方法。比如,我們可以把1-100這些數(shù)字存儲(chǔ)在一個(gè)數(shù)組中,然后在for循環(huán)中隨機(jī)產(chǎn)生兩個(gè)下標(biāo),如果這兩個(gè)下標(biāo)不相等的話,可以交換數(shù)組中的元素,實(shí)現(xiàn)過(guò)程如下所示:

import java.util.Random; 
/**
 * 隨機(jī)調(diào)換位置實(shí)現(xiàn)
 * @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;
        }
        //隨機(jī)交換values.length次  
        for(int i = 0;i < values.length;i++){  
            temp1 = Math.abs(r.nextInt()) % (values.length-1); //隨機(jī)產(chǎn)生一個(gè)位置  
            temp2 = Math.abs(r.nextInt()) % (values.length-1); //隨機(jī)產(chǎn)生另一個(gè)位置               
            if(temp1 != temp2){
                temp3 = values[temp1];  
                values[temp1] = values[temp2];  
                values[temp2] = temp3;
            }
        }           
        // 遍歷數(shù)組并打印數(shù)據(jù)
        for(int i = 0;i < 20;i++){
            System.out.print(values[i] + "\t");
            if(( i + 1 ) % 10 == 0){
                System.out.println("\n");
            }
        }
    }
}

以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"Java不重復(fù)隨機(jī)數(shù)的生成方法總結(jié)",希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為您服務(wù)。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 伊人网综合视频 | 免费黄色网址在线播放 | 国产视频中文字幕 | 最近中文免费字幕8 | 最近的2019免费中文字幕 | 一级黄色免费 | 日韩在线视频观看 | 日韩不卡一区二区 | 制服丝袜中文字幕在线观看 | 日韩精品无码一区二区三区 | 色天使色婷婷在线影院亚洲 | 一级一级特黄女人精品毛片视频 | 欧美另类日韩中文色综合 | 欧美一区二区三区综合色视频 | 国产精品成人影院 | 午夜影视在线 | 午夜免费视频观看 | 免费看a| 国产最新精品2020好看的 | 海天翼精品一区二区三区 | 国产成人精品怡红院 | 成年人视频在线免费 | 欧美很黄视频在线观看 | 午夜激情影视 | 自拍偷拍国语对白 | 亚洲va欧美va国产 | 一级毛片视频在线观看 | 国产成人精品视频一区 | 国产小视频在线免费观看 | 天天影视色香欲综合网网站麻豆 | 44383亚洲大成网人网站 | 国产亚洲精品日韩香蕉网 | 国产精品一区二区三区免费视频 | 欧美成人另类人妖 | 能在线观看的一区二区三区 | 国产精品天天在线 | 男人女人真曰批的视频动态 | 福利网站导航 | 日本一二三区在线视频 | 国产最新进精品视频 | 777欧美午夜精品影院 |