国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java隨機抽取指定范圍不重復的數字

java隨機抽取指定范圍不重復的數字

2020-05-09 11:58Healtheon JAVA教程

這篇文章主要介紹了java隨機抽取指定范圍不重復的數字的相關資料,需要的朋友可以參考下

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

希望這篇文章能給初次接觸的朋友一些幫助,因為我曾接觸過一些朋友要么寫不出來,要么使用很平鋪的思維方式去實現它。
一般有點開發經驗的朋友都能實現這樣的功能,只不過是效率上的問題。我們一般在面對這樣的問題時,總會平鋪直序的聯想到,先生成一個數組,然后在一個循環中向數組中添加隨機數字,在添加數字的過程中先查找一下數組中是否存在這個數字,如果不存在這個數字就直接添加到數組中;如果存在這個數字就不添加。我們一般都是這樣考慮問題的,這樣考慮也能實現功能,我剛才也說了,只不過是效率上的問題。

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

在這里呢,沒有給我們規定數組的長度,我們可以讓它是1-100之間的任意長度。
接下來讓我們看一下幾種實現方法并對這幾種方法作個對比
通常我們會使用ArrayList或數組來實現,先來看下ArrayList實現過程,如下面代碼所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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");
      }
    }
  }
}

使用數組實現的過程如下所示代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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了,如下代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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來實現,如下代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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循環就可以了。如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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,檢驗下運行效果,如下圖所示:

java隨機抽取指定范圍不重復的數字

以上幾種相比較而言,使用HashMap的效率是比較高的,其實是HashSet,再次是數組,最后是ArrayList。如果我們生成10000個數據將會發現,使用HashMap花費時間是:0.05s,HashSet是0.07s,數組是:0.20s,而ArrayList是0.25s。有興趣的可以設置下時間查看一下。
當然了,除了使用HashMap實現外,還有其它高效的方法。比如,我們可以把1-100這些數字存儲在一個數組中,然后在for循環中隨機產生兩個下標,如果這兩個下標不相等的話,可以交換數組中的元素,實現過程如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91精品亚洲| 国产一级片 | 在线观看亚洲精品 | 中国av在线免费观看 | 成人看片毛片免费播放器 | 中文字幕第一页在线 | 亚洲黄色特级片 | 日本成人 | 中文在线√天堂 | 精品国产成人 | 国产999精品久久久久久 | 日韩第一区 | 7799精品视频 | 天天澡天天狠天天天做 | 亚洲高清一区二区三区 | 国产综合精品 | 激情久久久久 | 国产欧美精品一区二区色综合 | 日本中文字幕在线观看 | 亚洲一区在线观看视频 | 午夜精品福利电影 | 国产精品久久久久久久9999 | 极品粉嫩饱满一线天在线 | 一级黄色国产视频 | 国产日韩一区二区三区 | 免费黄色在线看 | 亚洲一区欧美一区 | 亚洲乱码日产精品一二三 | 中文在线一区二区 | 亚洲男人在线天堂 | 来个毛片 | 乱人伦xxxx国语对白 | 日韩精品一区二区三区在线 | 日本中文字幕一区 | 狠狠干天天草 | 欧美性一区 | 国产中文字幕在线 | 国产精品一区av | 国产免费自拍 | 日韩欧美精品在线 | 精品久久精品 |