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