var arr = [0,1,2,3,4,5,6,7]
完全打亂,要求,每個元素的位置必須改變
首先,題主並不是要傳統的數組亂序,如果是傳統的數組亂序,當然首推Fisher-Yates,Math.random() 的黑科技並不能保證概率的一致,詳情可以看我以前的分析https://github.com/hanzichi/u...
如果每個位置都需要變動,隨便寫了一段程式碼,勉強可以用:
function shuffle(a) { let len = a.length; let shuffled = Array(len); for (let i = len; i--; ) { let rand = ~~(Math.random() * i); shuffled[i] = a[rand]; a[rand] = a[i]; } return shuffled; }
新建了一個數組,並且污染了原始數組,很不優雅,主題可以自己改進下
把最後一個放第一個就實現了每個元素都動了,可是完全打亂是什麼意思?
var arr = [0,1,2,3,4,5,6,7], last = arr[arr.length - 1]; arr.splice(arr.length - 1, 1); arr.unshift(last)
隨機是不可能保證每個位置都會變動的。
要徹底打亂,就不能保證位置都變。
笨一點的方法就是打亂一次,再跟陣列做比較,直到符合條件為止。
雷雷
函數隨機播放 (arr) {
隨機平移,凱撒加密紅火火…
function shuffle (arr) { if (!Array.isArray(arr)) { return [] } var len = Math.floor(Math.random() * (arr.length - 1)) + 1 return arr.slice(len).concat(arr.slice(0, len)) }
最簡單的位置全都動
> arr = [0,1,2,3,4,5,6,7] > arr.unshift(arr.pop()) > arr [ 7, 0, 1, 2, 3, 4, 5, 6 ] > arr.sort((a , b)=>Math.random() > 0.5 ? -1:1) [ 6, 5, 4, 0, 1, 3, 7, 2 ] > arr.sort((a , b)=>Math.random() > 0.5 ? -1:1) [ 6, 0, 5, 3, 4, 7, 1, 2 ]
位置全都動其實不是最亂的;
位置全都動
最亂的應該是隨機洗牌,有一定機率保持某個數不動,這樣才沒規律可循。
首先,題主並不是要傳統的數組亂序,如果是傳統的數組亂序,當然首推Fisher-Yates,Math.random() 的黑科技並不能保證概率的一致,詳情可以看我以前的分析https://github.com/hanzichi/u...
如果每個位置都需要變動,隨便寫了一段程式碼,勉強可以用:
新建了一個數組,並且污染了原始數組,很不優雅,主題可以自己改進下
把最後一個放第一個就實現了每個元素都動了,可是完全打亂是什麼意思?
隨機是不可能保證每個位置都會變動的。
要徹底打亂,就不能保證位置都變。
笨一點的方法就是打亂一次,再跟陣列做比較,直到符合條件為止。
雷雷
雷雷
函數隨機播放 (arr) {
雷雷隨機平移,凱撒加密紅火火…
最簡單的位置全都動
位置全都動
其實不是最亂的;最亂的應該是隨機洗牌,有一定機率保持某個數不動,這樣才沒規律可循。