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 }