如何将一个 JavaScript 数组的顺序打乱并且又能做到完全随机打乱呢?今天在网上看到了这样一个算法,觉得思路很不错,写上来记录一下。
比如我们有这样一个数组:
1
| let arr = [1, 2, 3, 4, 5, 6]
|
实现思路是这样的:
- 首先用数组的最后一个值
arr[arr.length - 1] 来与前面的 5 个值中随机抽取一个值交换位置。
- 在上一步中我们已经把数组末尾的值调换了位置,接着按照同样的方法对倒数第二个值进行同样的操作,再调换一次位置。
- 对下一个值执行相同的操作,直到全部执行完毕(执行到数组的第二个值就可以了)。
下面我们用代码来实现一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| let arr = [1, 2, 3, 4, 5, 6]
function randomSortArr(arr) { function exchange(max) { return Math.floor(Math.random() * (max + 1)) } for (let i = arr.length - 1; i > 0; i--) { let randomIndex = exchange(i - 1) let num = arr[i] arr[i] = arr[randomIndex] arr[randomIndex] = num } return arr }
console.log(randomSortArr(arr))
|
结果如我们所愿,数组被成功打乱了。下面再上一个优化了代码数量后的版本(方法一样,只是简化了代码量,第一个方法便于读者理解):
1 2 3 4 5 6 7 8 9 10 11
| let arr = [1, 2, 3, 4, 5, 6]
function randomSortArr(arr) { for (let i = arr.length - 1; i > 0; i--) { let randomIndex = Math.floor(Math.random() * i); [arr[i], arr[randomIndex]] = [arr[randomIndex], arr[i]] } return arr }
console.log(randomSortArr(arr))
|
算法转载自 知乎