let arr = ["1","2", "3", "4", "5", "6", "7", "8"]
let length = arr.length
let random = 0
let resultList = []
while(length > 0) {
random = parseInt(Math.random() * length)
resultList.push(arr[random])
arr.splice(random, 1)
length--
}
console.log("resultList is : " + resultList)
Result:
resultList is : 2,4,1,6,5,8,7,3
但是之前好像看过有人喷阮一峰老师的一个算法,说splice的时间复杂度太高,降低了算法的性能,所以如果希望提高此算法的性能,建议自己实现从一个数组中删除一个元素的操作。
这里我给出一种思路:
因为我们是随机排序所以并不在乎数组中元素的位置。我们可以每次取出一个指定位子的数值之后,将最后一个元素复制到取出元素的位子,将原数据覆盖。
又因为我们每次length都会减1所以最后面的元素在下次随机取数时并不会被取到,所以即使数组的实际大小并没有改变,对我们的算法也不会造成影响。
代码如下:
let arr = ["1","2", "3", "4", "5", "6", "7", "8"]
let length = arr.length
let random = 0
let resultList = []
while(length > 0) {
random = parseInt(Math.random() * length)
resultList.push(arr[random])
arr[random] = arr[--length]
}
console.log("resultList is : " + resultList)
注意length的长度与数组的序号之间的差异。