1. 程式人生 > >java 隨機數高效生成

java 隨機數高效生成

分享牛,分享牛原創。近期去面試經常被問到java如何生產隨機數,以及生成很大的字串保證不能重複,還要考慮效能,之前本人面試別人的時候,可能不會問這個問題。既然這個java隨機數問題經常被問到,那咱們也就寫幾種實現方式吧。僅供參考。

1.1.1. 第一種方式

第一種方式,咱們考慮一下,生成的字串不能重複,怎麼辦呢?首先想到hashMaphashSet的特性吧。那怎麼就先用這種方式實現吧。以下是hashMap的實現方式。

public static void main(String[] args) {
        Object[] values = new Object[100];
        Random random = new Random();
        HashMap<Object, Object> hashMap = new HashMap<Object, Object>(50);
        // 生成隨機數字並存入HashMap
        for(int i = 0;i < values.length;i++){
            int number = random.nextInt(100) + 1;
            hashMap.put(number, i);
        }
        values=hashMap.keySet().toArray();
     // 遍歷陣列並列印資料
        for(int i = 0;i < values.length;i++){
            System.out.print(values[i] + "\t");
        }
}

這裡需要注意的就是hashMap中的增長因子的問題了。要儘量避免HashMap中的陣列擴容問題。

hashMap中的建構函式兩個引數的含義:

初始容量,載入因子

1.1.2. 第二種方式

可以把希望生成的值放入到一個數組中,然後程式隨機去讀取陣列中任意兩個座標,如果座標相等則繼續隨機,如果座標不相等,就交換兩個座標的值。具體的實現如下:

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");
        }

1.1.3. 總結

個人覺得陣列第二種的方式比較快,因為陣列的訪問速度快。這也是陣列結構決定的。

分享牛原創(尊重原創 轉載對的時候第一行請註明,轉載出處來自分享牛http://blog.csdn.net/qq_30739519)