1. 程式人生 > >m個元素的陣列,隨機選擇n個不重複元素(js實現)

m個元素的陣列,隨機選擇n個不重複元素(js實現)

問題描述:

在由m個元素的source陣列中,隨機選擇n個不重複的元素放入新陣列target

注:source陣列元素本身不重複,m>n

解決方案

方案一:

  1. 根據陣列source,在0到source.length-1範圍內隨機一個數作為下標,選擇下標對應元素放入陣列target
  2. 同1法,再從source陣列隨機一個數,將這個數與target陣列中已有的數進行比較,不同則放入,相同則再隨機
  3. 重複執行2,然後就能篩選出n個不同的數。

方案二:

  1. 根據陣列source,在0到source.length-1範圍內隨機一個數作為下標,選擇下標放入陣列target
  2. 同1法,隨機一個新的下標,將這個數與target陣列中已有的數進行比較,不同則放入,相同則再隨機
  3. 重複執行2,然後就能篩選出n個不同的數。
  4. 這個時候陣列target都存放的是要選取的數的下標,我們根據下標轉換成對應的source陣列中的數即可

方案一和方案二的區別:

我們平時可能用方案一比較多,因為比較直觀,但是分析表明,方案二是更好的。原因:方案一比較的是真實資料,方案二比較的是下標,所以方案二在比較儲存時效率較高,且儲存所佔記憶體小。

方案二JavaScript程式碼

    /**
     *  source共10個元素
     *  選擇4個數據儲存在target
     *  
     */
    (function(){
        var source= [
            "c"
,"c++","php","html","css","javascript","java","jsp","asp","node" ]; var sL = source.length; var target= []; //儲存下標 //隨機4個數組下標 for(var i = 0; i < 4; i++){ var rand = Math.floor( Math.random() * sL ); if(target.length > 0){ detection(target, rand); }else
{ target.push(rand); } } //檢測num是否存在於arr,存在重新新增,不存在直接新增 function detection(arr, num){ var repeatFlag = false; for(var j = 0; j < arr.length; j++){ if(arr[j] == num){ repeatFlag = true; } } if(repeatFlag){ //遞迴 arguments.callee(arr, Math.floor( Math.random() * sL )); }else{ arr.push(num); } } //測試,輸出target //for(var i=0; i<target.length; i++){ // console.log(source[target[i]]); //} })();

註釋的程式碼,為測試的程式碼。

我也是優化了半天才想出的方法,很是(∩_∩),簡單的問題不斷從優解決,我們會更加進步。