Javascript隨機(jī)獲取數(shù)組中不重復(fù)的n個(gè)元素
實(shí)現(xiàn)方式 推薦
實(shí)現(xiàn)思路
把源數(shù)組分成左右兩段,左邊按順序遞增,保存已選擇的隨機(jī)數(shù);右側(cè)是剩余可選的數(shù)值;每次從右側(cè)選一個(gè),與左側(cè)最后一個(gè)位置的數(shù)值交換就可以達(dá)到目的。
然后考慮把左側(cè)用一個(gè)新數(shù)組表示,右側(cè)選中的數(shù)移入新數(shù)組,再將左側(cè)應(yīng)該交換過來的值移過來……
算法圖解:

1 // 推薦方法 2 function getNoRepeatEle(n) { 3 const arr = Array.from({ length: 100 }, (v, k) => k + 1); 4 const result = []; 5 let len = arr.length; 6 for (let i = 0; i < n; i++) { 7 const index = ~~(Math.random() * len) + i; // ~~雙按位非 取整 8 if (result.includes(arr[index])) { 9 continue; 10 } 11 result.push(arr[index]); 12 arr[index] = arr[i]; 13 len--; 14 } 15 return result; 16 } 17 18 // 變形 ,舉一反三 19 20 function getNoRepeatEle2(n) { 21 const arr = Array.from({ length: 100 }, (v, k) => k + 1); 22 let result = []; 23 let len = arr.length; 24 25 for (let i = 0; i < n; i++) { 26 let ran = Math.floor(Math.random() * (len - i)); 27 if (result.includes(arr[ran])) { 28 continue; 29 } 30 result.push(arr[ran]); 31 32 arr[ran] = arr[len - i - 1]; 33 } 34 35 return result; 36 }

浙公網(wǎng)安備 33010602011771號(hào)