m個元素的陣列,隨機選擇n個不重複元素(js實現)
阿新 • • 發佈:2019-01-04
問題描述:
在由m個元素的source陣列中,隨機選擇n個不重複的元素放入新陣列target
注:source陣列元素本身不重複,m>n
解決方案
方案一:
- 根據陣列source,在0到source.length-1範圍內隨機一個數作為下標,選擇下標對應元素放入陣列target
- 同1法,再從source陣列隨機一個數,將這個數與target陣列中已有的數進行比較,不同則放入,相同則再隨機
- 重複執行2,然後就能篩選出n個不同的數。
方案二:
- 根據陣列source,在0到source.length-1範圍內隨機一個數作為下標,選擇下標放入陣列target
- 同1法,隨機一個新的下標,將這個數與target陣列中已有的數進行比較,不同則放入,相同則再隨機
- 重複執行2,然後就能篩選出n個不同的數。
- 這個時候陣列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]]);
//}
})();
註釋的程式碼,為測試的程式碼。
我也是優化了半天才想出的方法,很是(∩_∩),簡單的問題不斷從優解決,我們會更加進步。