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 }

 

 

posted @ 2021-07-07 17:28  Bruce_Grace  阅读(478)  评论(0编辑  收藏  举报