国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js 數組隨機數 數組洗牌

jay_tian / 641人閱讀

摘要:首先通過數組調用是令系統隨機選取大于等于且小于的偽隨機值進入到函數后分別定義了變量和變量為當前數組的長度,先聲明,以便在下面中使用。循環一圈后就形成了對數組的洗牌。

這次分享一個隨機數組洗牌的一個算法,讓你得到隨機數組。

假如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 源碼(三)隨機洗牌算法

    摘要:隨機洗牌算法說實話,以前理解數組的排序,都是將數組按照一定的邏輯由大到小或者由小到大排序,我自己是沒有碰到過隨機打亂數組排序的問題。然后里用的是所謂的洗牌算法,很高效。總結又是三個知識點,分別是隨機洗牌分組和函數的實現,沒什么復雜的。 這是第三篇關于 Underscore 的源碼解讀,最近一段時間學的東西很少,自己太忙了,一方面忙著找實習,晚上回去還要寫畢業論文。畢業論文真的很憂傷,因...

    silencezwm 評論0 收藏0
  • 數組隨機排序:洗牌算法(Fisher–Yates shuffle)

    摘要:代碼實現代碼一測試用例輸出其中,代碼二測試用例輸出其中,參考資料洗牌算法學習筆記數組隨機排序洗牌算法給數組隨機排序洗牌算法原理 原理及步驟 1.定義一個數組(shuffled),長度(length)是原數組(arr)長度2.取 0 到 index (初始0) 隨機值 rand, shuffled[index] = shuffled[rand], shuffled[rand] = arr...

    張金寶 評論0 收藏0
  • 隨機問題之洗牌算法

    摘要:百度文庫洗牌算法提到一種換牌思路隨機交換兩個位置,共交換次,越大,越接近隨機。洗牌插牌法優化版,可以用數學歸納法證明,這種洗牌是均勻的。每次生成一張最大的牌,與隨機的某張牌換位子抽牌抽牌優化換牌插牌插牌優化文章轉載自隨機問題之洗牌算法 洗牌算法是我們常見的隨機問題,在玩游戲、隨機排序時經常會碰到。它可以抽象成這樣一個問題。 得到一個M以內的所有自然數的隨機順序數組。 在百度搜洗牌算法,...

    instein 評論0 收藏0
  • 也談前端面試常見問題之『數組亂序』

    摘要:看完部分的源碼,首先迫不及待想跟大家分享的正是本文主題數組亂序。這是一道經典的前端面試題,給你一個數組,將其打亂,返回新的數組,即為數組亂序,也稱為洗牌問題。關于數組亂序,正確的解法應該是,復雜度。 前言 終于可以開始 Collection Functions 部分了。 可能有的童鞋是第一次看樓主的系列文章,這里再做下簡單的介紹。樓主在閱讀 underscore.js 源碼的時候,學到...

    tracy 評論0 收藏0
  • 洗牌算法

    摘要:描述拷貝數組從掃描數組,選擇一個隨機數新數組的新數組的新數組的原始數組重復第步,直到末尾最終的新數組就是隨機的參考三種洗牌算法 洗牌算法 Fisher-Yates Shuffle Fisher–Yates 隨機置亂算法,通俗說就是生成一個有限集合的隨機排列。 描述: 寫下從 1 到 N 的數字 取一個從 1 到剩下的數字(包括這個數字)的隨機數 k 從低位開始,得到第 k 個還沒有被...

    omgdog 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<