最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java隨機抽取指定范圍不重復的數(shù)字

 更新時間:2016年06月02日 15:12:47   作者:Healtheon  
這篇文章主要介紹了java隨機抽取指定范圍不重復的數(shù)字的相關資料,需要的朋友可以參考下

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

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

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

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

import java.util.ArrayList;
import java.util.Random;

/**
 * 使用ArrayList實現(xiàn)
 * @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();
    
    // 遍歷數(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)的過程如下所示代碼:

import java.util.Random;

/**
 * 使用數(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");
      }
    }
  }
}

上面這兩個實現(xiàn)過程效率比較低的。因為在每次添加時都要去遍歷一下當前列表中是否存在這個數(shù)字,時間復雜度是O(N^2)。我們可以這樣思考一下:既然涉及到無重復,我們可以想一下HashSet和HashMap的功能。HashSet實現(xiàn)Set接口,Set在數(shù)學上的定義就是無重復,無次序的集合。而HashMap實現(xiàn)Map,也是不允許重復的Key。這樣我們可以使用HashMap或HashSet來實現(xiàn)。
在使用HashMap實現(xiàn)時,只需要將它的key轉化成數(shù)組就Ok了,如下代碼:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Random;
import java.util.Map.Entry;

/**
 * 使用HashMap實現(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<Object, Object> hashMap = new HashMap<Object, Object>();
    
    // 生成隨機數(shù)字并存入HashMap
    for(int i = 0;i < values.length;i++){
      int number = random.nextInt(100) + 1;
      hashMap.put(number, i);
    }
    
    // 從HashMap導入數(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<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來實現(xiàn)的,只不過沒有Value的集合,只有一個Key的集合,所以也可使用HashSet來實現(xiàn),如下代碼:

import java.util.HashSet;
import java.util.Random;

/**
 * 使用HashSet實現(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<Integer> hashSet = new HashSet<Integer>();
    
    // 生成隨機數(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");
      }
    }
  }
}

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

import java.util.HashSet;
import java.util.Random;

/**
 * 使用HashSet實現(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<Integer> hashSet = new HashSet<Integer>();
    
    // 生成隨機數(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");
      }
    }
  }
}

我們可以把數(shù)組的長度設置成100,檢驗下運行效果,如下圖所示:

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

import java.util.Random;

/**
 * 隨機調換位置實現(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;
    }
    
    //隨機交換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;
      } 
    }  
    
    // 遍歷數(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");
      }
    }
  }
}

這種方法也是比較高效的,如果生成10000個數(shù)據(jù),那么它所用的時間是0.054s。
在數(shù)組中利用坐標來實現(xiàn)的基礎上可以變換更多相關的解決方法,具體地可以查閱相關資料。
以上是關于在JAVA中實現(xiàn)隨機無重復數(shù)字的功能,當然方法也不僅限于這么幾種,還有其它的實現(xiàn)方法。希望能對接觸不久的朋友有所幫助,也希望能夠起到拋磚引玉的作用。
原文網(wǎng)址:http://www.cnblogs.com/hanyonglu/archive/2012/10/18/2730007.html
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 深入理解mybatis的ParamNameResolver

    深入理解mybatis的ParamNameResolver

    ParamNameResolver是 MyBatis 中的一個重要組件,它為 MyBatis 提供了一種方便的方式來獲取方法參數(shù)的名稱,本文主要介紹了深入理解mybatis的ParamNameResolver,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • 詳解Java弱引用(WeakReference)的理解與使用

    詳解Java弱引用(WeakReference)的理解與使用

    這篇文章主要介紹了Java弱引用(WeakReference)的理解與使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Java集合源碼全面分析

    Java集合源碼全面分析

    下面小編就為大家?guī)硪黄狫ava集合源碼全面分析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • Java面向對象基礎教學(二)

    Java面向對象基礎教學(二)

    這篇文章主要介紹了Java的面相對象編程思想,包括類對象方法和封裝繼承多態(tài)等各個方面的OOP基本要素,非常推薦,需要的朋友可以參考下,希望可以對你有所幫助
    2021-07-07
  • SpringBoot快速整合通用Mapper的示例代碼

    SpringBoot快速整合通用Mapper的示例代碼

    后端業(yè)務開發(fā),每個表都要用到單表的?增刪改查?等通用方法,而配置了通用Mapper可以極大的方便使用Mybatis單表的增刪改查操作,這篇文章主要介紹了SpringBoot快速整合通用Mapper,需要的朋友可以參考下
    2022-07-07
  • 寶塔升級JDK版本超詳細圖文教程

    寶塔升級JDK版本超詳細圖文教程

    寶塔自動安裝的JDK是一種用于開發(fā)和運行Java程序的軟件開發(fā)工具包,下面這篇文章主要給大家介紹了關于寶塔升級JDK版本的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Effective Java (異常處理)

    Effective Java (異常處理)

    Effective Java (異常處理),需要的朋友可以參考一下
    2013-02-02
  • Maven pom.xml 添加本地jar包依賴以及打包方法

    Maven pom.xml 添加本地jar包依賴以及打包方法

    這篇文章主要介紹了Maven pom.xml 添加本地jar包依賴以及打包方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • java mybatis框架配置詳解

    java mybatis框架配置詳解

    在本篇文章里小編給大家整理的是一篇關于java mybatis框架配置詳解內容,對此有興趣的朋友們可以參考下。
    2021-02-02
  • java 數(shù)據(jù)結構中棧結構應用的兩個實例

    java 數(shù)據(jù)結構中棧結構應用的兩個實例

    這篇文章主要介紹了java 數(shù)據(jù)結構中棧結構應用的兩個實例的相關資料,需要的朋友可以參考下
    2017-06-06

最新評論

哈尔滨市| 徐水县| 日土县| 盐边县| 盐边县| 资溪县| 莱芜市| 仙居县| 新宾| 石家庄市| 福安市| 黑龙江省| 兴业县| 东山县| 民权县| 宜兰市| 吉首市| 吴忠市| 皮山县| 沁水县| 吉水县| 定边县| 阿鲁科尔沁旗| 隆德县| 科技| 泰州市| 东乌珠穆沁旗| 喀什市| 青川县| 都江堰市| 拉萨市| 嵩明县| 禹城市| 教育| 汽车| 石棉县| 鄢陵县| 武鸣县| 新巴尔虎左旗| 巩义市| 彰化市|