成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

js 數(shù)組隨機(jī)數(shù) 數(shù)組洗牌

jay_tian / 696人閱讀

摘要:首先通過(guò)數(shù)組調(diào)用是令系統(tǒng)隨機(jī)選取大于等于且小于的偽隨機(jī)值進(jìn)入到函數(shù)后分別定義了變量和變量為當(dāng)前數(shù)組的長(zhǎng)度,先聲明,以便在下面中使用。循環(huán)一圈后就形成了對(duì)數(shù)組的洗牌。

這次分享一個(gè)隨機(jī)數(shù)組洗牌的一個(gè)算法,讓你得到隨機(jī)數(shù)組。

假如1個(gè)數(shù)組的值是這樣的:

const arr = ["a", "b", "c", "d", "e", "f", "g"];

因?yàn)樵趯?shí)踐操作中,在網(wǎng)上搜可以搜到一大堆隨機(jī)的這些代碼。但是實(shí)際上究竟是不是完全隨機(jī),效率和兼容性都有待測(cè)試,如果有這方面的需求 可以嘗試以下的代碼。具體這個(gè)代碼的算法是如何得出的,是否是完全隨機(jī),可以看看下面文章。

德州撲克

如何隨機(jī)化(shuffle)一個(gè)JavaScript數(shù)組?

費(fèi)雪耶茨洗牌

下面是具體實(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;
}

上面代碼對(duì)數(shù)組原型進(jìn)行了擴(kuò)展,加了 shuffle 方法 通過(guò)數(shù)組調(diào)用的方式完成的隨機(jī)數(shù)組項(xiàng)的重組. 讓我們來(lái)看下實(shí)現(xiàn)的過(guò)程。
首先通過(guò)數(shù)組調(diào)用
Math.random()是令系統(tǒng)隨機(jī)選取大于等于 0.0 且小于 1.0 的偽隨機(jī) double 值

arr.shuffle(); 

進(jìn)入到函數(shù)后 分別定義了 m 變量和 i 變量;
m為當(dāng)前數(shù)組的長(zhǎng)度, i先聲明 ,以便在下面while中使用。
通過(guò)while循環(huán)進(jìn)行遍歷;

 i = (Math.random() * m--) >>> 0;

大家看到上面這行代碼代碼時(shí)可能對(duì)后面的表達(dá)式稍微有點(diǎn)疑惑:
Math.random()是隨機(jī)選取大于等于 0.0 且小于 1.0 的偽隨機(jī) double 值 這個(gè)有點(diǎn)js基礎(chǔ)的都知道
主要對(duì)于 >>> 0;會(huì)有點(diǎn)迷惑 那么他們是什么呢?

通過(guò)上述我們可以看到 這個(gè) >>> 是無(wú)符號(hào)右移
但是位移0位有什么作用呢?
stackoverflow 查了一些資料 引入里面一個(gè) 高票的回答
原來(lái)移位操作符在移位操作前做了兩種類(lèi)似轉(zhuǎn)換:

將不是number類(lèi)型的數(shù)據(jù)轉(zhuǎn)換為number,

將number轉(zhuǎn)換為無(wú)符號(hào)的32bit數(shù)據(jù),也就是Uint32類(lèi)型。這些與移位的位數(shù)無(wú)關(guān),移位0位主要就是用了js的內(nèi)部特性做了前兩種轉(zhuǎn)換。

我們知道Uint32如果不能轉(zhuǎn)換為Number,那就為0,如果為非整數(shù),先轉(zhuǎn)換為整數(shù);

x >>> 0本質(zhì)上就是保證x有意義(為數(shù)字類(lèi)型),且為正整數(shù),在有效的數(shù)組范圍內(nèi)(且在無(wú)意義的情況下缺省值為0;
知道了這些后我們就繼續(xù)下面代碼的分析
首先Math.random()會(huì)返回一個(gè)0到1之前的隨機(jī)數(shù) 假設(shè)我們返回的是0.999... 那么我們?cè)诘谝淮窝h(huán)的 m--后的值為6 那我們得到值就是 5.994.... 通過(guò)無(wú)符號(hào)右移 得到一個(gè)整數(shù)值為 5,也就是 i值現(xiàn)在是5 開(kāi)始執(zhí)行下列代碼:

[this[m], this[i]] = [this[i], this[m]]

上面代碼為es6新語(yǔ)法 解構(gòu)賦值 ,通過(guò)上邊代碼 我們得到值 m 為6 i為5,上面代碼實(shí)際實(shí)現(xiàn)了 下標(biāo)為m的值和下標(biāo)為i的值位置的互換。
后面依次執(zhí)行進(jìn)行循環(huán)...
因?yàn)槊看窝h(huán)i的值不斷變化 所以位置的互換也在不斷變化。 循環(huán)一圈后就形成了對(duì)數(shù)組的洗牌。
最后返回洗牌后的數(shù)組。

如果你遇到類(lèi)似的需求,那就快拷貝代碼,用一個(gè)數(shù)組嘗試一下吧~?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/106293.html

相關(guān)文章

  • Underscore 源碼(三)隨機(jī)洗牌算法

    摘要:隨機(jī)洗牌算法說(shuō)實(shí)話(huà),以前理解數(shù)組的排序,都是將數(shù)組按照一定的邏輯由大到小或者由小到大排序,我自己是沒(méi)有碰到過(guò)隨機(jī)打亂數(shù)組排序的問(wèn)題。然后里用的是所謂的洗牌算法,很高效??偨Y(jié)又是三個(gè)知識(shí)點(diǎn),分別是隨機(jī)洗牌分組和函數(shù)的實(shí)現(xiàn),沒(méi)什么復(fù)雜的。 這是第三篇關(guān)于 Underscore 的源碼解讀,最近一段時(shí)間學(xué)的東西很少,自己太忙了,一方面忙著找實(shí)習(xí),晚上回去還要寫(xiě)畢業(yè)論文。畢業(yè)論文真的很憂(yōu)傷,因...

    silencezwm 評(píng)論0 收藏0
  • 數(shù)組隨機(jī)排序:洗牌算法(Fisher–Yates shuffle)

    摘要:代碼實(shí)現(xiàn)代碼一測(cè)試用例輸出其中,代碼二測(cè)試用例輸出其中,參考資料洗牌算法學(xué)習(xí)筆記數(shù)組隨機(jī)排序洗牌算法給數(shù)組隨機(jī)排序洗牌算法原理 原理及步驟 1.定義一個(gè)數(shù)組(shuffled),長(zhǎng)度(length)是原數(shù)組(arr)長(zhǎng)度2.取 0 到 index (初始0) 隨機(jī)值 rand, shuffled[index] = shuffled[rand], shuffled[rand] = arr...

    張金寶 評(píng)論0 收藏0
  • 隨機(jī)問(wèn)題之洗牌算法

    摘要:百度文庫(kù)洗牌算法提到一種換牌思路隨機(jī)交換兩個(gè)位置,共交換次,越大,越接近隨機(jī)。洗牌插牌法優(yōu)化版,可以用數(shù)學(xué)歸納法證明,這種洗牌是均勻的。每次生成一張最大的牌,與隨機(jī)的某張牌換位子抽牌抽牌優(yōu)化換牌插牌插牌優(yōu)化文章轉(zhuǎn)載自隨機(jī)問(wèn)題之洗牌算法 洗牌算法是我們常見(jiàn)的隨機(jī)問(wèn)題,在玩游戲、隨機(jī)排序時(shí)經(jīng)常會(huì)碰到。它可以抽象成這樣一個(gè)問(wèn)題。 得到一個(gè)M以?xún)?nèi)的所有自然數(shù)的隨機(jī)順序數(shù)組。 在百度搜洗牌算法,...

    instein 評(píng)論0 收藏0
  • 也談前端面試常見(jiàn)問(wèn)題之『數(shù)組亂序』

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

    tracy 評(píng)論0 收藏0
  • 洗牌算法

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

    omgdog 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<