摘要:首先通過數組調用是令系統隨機選取大于等于且小于的偽隨機值進入到函數后分別定義了變量和變量為當前數組的長度,先聲明,以便在下面中使用。循環一圈后就形成了對數組的洗牌。
這次分享一個隨機數組洗牌的一個算法,讓你得到隨機數組。
假如1個數組的值是這樣的:
const arr = ["a", "b", "c", "d", "e", "f", "g"];
因為在實踐操作中,在網上搜可以搜到一大堆隨機的這些代碼。但是實際上究竟是不是完全隨機,效率和兼容性都有待測試,如果有這方面的需求 可以嘗試以下的代碼。具體這個代碼的算法是如何得出的,是否是完全隨機,可以看看下面文章。
德州撲克
如何隨機化(shuffle)一個JavaScript數組?
費雪耶茨洗牌
下面是具體實現的代碼
Array.prototype.shuffle = function() { let m = this.length, i; while (m) { i = (Math.random() * m--) >>> 0; [this[m], this[i]] = [this[i], this[m]] } return this; }
上面代碼對數組原型進行了擴展,加了 shuffle 方法 通過數組調用的方式完成的隨機數組項的重組. 讓我們來看下實現的過程。
首先通過數組調用
Math.random()是令系統隨機選取大于等于 0.0 且小于 1.0 的偽隨機 double 值
arr.shuffle();
進入到函數后 分別定義了 m 變量和 i 變量;
m為當前數組的長度, i先聲明 ,以便在下面while中使用。
通過while循環進行遍歷;
i = (Math.random() * m--) >>> 0;
大家看到上面這行代碼代碼時可能對后面的表達式稍微有點疑惑:
Math.random()是隨機選取大于等于 0.0 且小于 1.0 的偽隨機 double 值 這個有點js基礎的都知道
主要對于 >>> 0;會有點迷惑 那么他們是什么呢?
通過上述我們可以看到 這個 >>> 是無符號右移
但是位移0位有什么作用呢?
在 stackoverflow 查了一些資料 引入里面一個 高票的回答
原來移位操作符在移位操作前做了兩種類似轉換:
將不是number類型的數據轉換為number,
將number轉換為無符號的32bit數據,也就是Uint32類型。這些與移位的位數無關,移位0位主要就是用了js的內部特性做了前兩種轉換。
我們知道Uint32如果不能轉換為Number,那就為0,如果為非整數,先轉換為整數;
x >>> 0本質上就是保證x有意義(為數字類型),且為正整數,在有效的數組范圍內(且在無意義的情況下缺省值為0;
知道了這些后我們就繼續下面代碼的分析
首先Math.random()會返回一個0到1之前的隨機數 假設我們返回的是0.999... 那么我們在第一次循環的 m--后的值為6 那我們得到值就是 5.994.... 通過無符號右移 得到一個整數值為 5,也就是 i值現在是5 開始執行下列代碼:
[this[m], this[i]] = [this[i], this[m]]
上面代碼為es6新語法 解構賦值 ,通過上邊代碼 我們得到值 m 為6 i為5,上面代碼實際實現了 下標為m的值和下標為i的值位置的互換。
后面依次執行進行循環...
因為每次循環i的值不斷變化 所以位置的互換也在不斷變化。 循環一圈后就形成了對數組的洗牌。
最后返回洗牌后的數組。
如果你遇到類似的需求,那就快拷貝代碼,用一個數組嘗試一下吧~?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/106293.html
摘要:隨機洗牌算法說實話,以前理解數組的排序,都是將數組按照一定的邏輯由大到小或者由小到大排序,我自己是沒有碰到過隨機打亂數組排序的問題。然后里用的是所謂的洗牌算法,很高效。總結又是三個知識點,分別是隨機洗牌分組和函數的實現,沒什么復雜的。 這是第三篇關于 Underscore 的源碼解讀,最近一段時間學的東西很少,自己太忙了,一方面忙著找實習,晚上回去還要寫畢業論文。畢業論文真的很憂傷,因...
摘要:代碼實現代碼一測試用例輸出其中,代碼二測試用例輸出其中,參考資料洗牌算法學習筆記數組隨機排序洗牌算法給數組隨機排序洗牌算法原理 原理及步驟 1.定義一個數組(shuffled),長度(length)是原數組(arr)長度2.取 0 到 index (初始0) 隨機值 rand, shuffled[index] = shuffled[rand], shuffled[rand] = arr...
摘要:看完部分的源碼,首先迫不及待想跟大家分享的正是本文主題數組亂序。這是一道經典的前端面試題,給你一個數組,將其打亂,返回新的數組,即為數組亂序,也稱為洗牌問題。關于數組亂序,正確的解法應該是,復雜度。 前言 終于可以開始 Collection Functions 部分了。 可能有的童鞋是第一次看樓主的系列文章,這里再做下簡單的介紹。樓主在閱讀 underscore.js 源碼的時候,學到...
閱讀 1201·2021-09-22 15:24
閱讀 2298·2019-08-30 15:44
閱讀 2629·2019-08-30 10:55
閱讀 3369·2019-08-29 13:25
閱讀 1653·2019-08-29 13:09
閱讀 1406·2019-08-26 14:05
閱讀 1399·2019-08-26 13:58
閱讀 1990·2019-08-26 11:57