Javascript随机获取数组中不重复的n个元素
实现方式 推荐
实现思路
把源数组分成左右两段,左边按顺序递增,保存已选择的随机数;右侧是剩余可选的数值;每次从右侧选一个,与左侧最后一个位置的数值交换就可以达到目的。
然后考虑把左侧用一个新数组表示,右侧选中的数移入新数组,再将左侧应该交换过来的值移过来……
算法图解:
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 }