Fisher–Yates 随机置乱算法,通俗说就是生成一个有限集合的随机排列。算法
描述:数组
function getRandom(arr, length) { const random = Math.floor(Math.random() * length) // 原始算法将在此处消耗较多资源 if (arr.includes(random)) { return getRandom(arr, length) } else { return random } } function randomArray(arr) { let newArr = [] const length = arr.length let index = length - 1 let indexArr = [] while (index >= 0) { const random = getRandom(indexArr, length) indexArr.push(random) newArr.push(arr[random]) --index } return newArr }
Knuth 和 Durstenfeld 在 Fisher 等人的基础上对算法进行了改进,不借助新的组数,直接在原地交换。该算法的基本思想和 Fisher 相似,每次从未处理的数据中随机取出一个数,并和最后一个剩余元素交换,而后剩余元素的数量减一。dom
function randomArray(arr) { const length = arr.length for (let index = length - 1; index > 0; index--) { const random = Math.floor(Math.random() * index) const temp = arr[index] arr[index] = arr[random] arr[random] = temp } return arr }
Inside-Out Algorithm 算法的思想是从前日后,借助旧数组,将新数组中位置 k 和位置 i 的数字进行交互。ide
描述.net
function randomArray(arr) { let newArr = arr.concat([]) const length = arr.length for (let index = 0; index < length; index++) { const random = Math.floor(Math.random() * (index + 1)) newArr[index] = newArr[random] newArr[random] = arr[index] } return newArr }