如何将一个JavaScript数组打乱

  如何将一个js数组的顺序打乱并且又能做到完全随机打乱呢?今天在网上看到了这样一个算法,觉得思路很不错,写上来记录一下。

  比如我们有这样一个数组:

1
let arr = [1, 2, 3, 4, 5, 6]

  实现思路是这样的:

  1. 首先用数组的最后一个值arr[arr.length - 1]来与前面的5个值中随机抽取一个值交换位置。
  2. 在上一步中我们已经把数组末尾的值调换了位置,接着按照同样的方法对倒数第二个值进行同样的操作,再调换一次位置。
  3. 对下一个值执行相同的操作,直到全部执行完毕(执行到数组的第二个值就可以了)。

  下面我们用代码来实现一下:

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) {
// 生成0到max之间的随机数
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)) // [2, 6, 5, 1, 4, 3]

  结果如我们所愿,数组被成功打乱了。下面再上一个优化了代码数量后的版本(方法一样,只是简化了代码量,第一个方法便于读者理解):

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))

算法转载自知乎

0%