程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java隨機抽取指定規模不反復的數字

java隨機抽取指定規模不反復的數字

編輯:關於JAVA

java隨機抽取指定規模不反復的數字。本站提示廣大學習愛好者:(java隨機抽取指定規模不反復的數字)文章只能為提供參考,不一定能成為您想要的結果。以下是java隨機抽取指定規模不反復的數字正文


本文給年夜家引見若何在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中完成隨機無反復數字的功效,固然辦法也不只限於這麼幾種,還有其它的完成辦法。願望能對接觸不久的同伙有所贊助,也願望可以或許起到拋磚引玉的感化。
原文網址:http://www.cnblogs.com/hanyonglu/archive/2012/10/18/2730007.html
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved