摘要:描述拷貝數(shù)組從掃描數(shù)組,選擇一個(gè)隨機(jī)數(shù)新數(shù)組的新數(shù)組的新數(shù)組的原始數(shù)組重復(fù)第步,直到末尾最終的新數(shù)組就是隨機(jī)的參考三種洗牌算法
洗牌算法 Fisher-Yates Shuffle
Fisher–Yates 隨機(jī)置亂算法,通俗說就是生成一個(gè)有限集合的隨機(jī)排列。
描述:
寫下從 1 到 N 的數(shù)字
取一個(gè)從 1 到剩下的數(shù)字(包括這個(gè)數(shù)字)的隨機(jī)數(shù) k
從低位開始,得到第 k 個(gè)還沒有被取出的數(shù)字,把它寫在獨(dú)立的一個(gè)列表的最后一位
重復(fù)第 2 步,直到所有的數(shù)字都被取出
第 3 步寫出的這個(gè)序列,現(xiàn)在就是原始數(shù)字的隨機(jī)排列
function getRandom(arr, length) { const random = Math.floor(Math.random() * length) // 原始算法將在此處消耗較多資源 if (arr.includes(random)) { return getRandom(arr, length) } else { return random } } function randomArray(arr) { let newArr = [] const length = arr.length let index = length - 1 let indexArr = [] while (index >= 0) { const random = getRandom(indexArr, length) indexArr.push(random) newArr.push(arr[random]) --index } return newArr }Knuth-Durstenfeld Shuffle
Knuth 和 ?Durstenfeld ? 在 Fisher 等人的基礎(chǔ)上對(duì)算法進(jìn)行了改進(jìn),不借助新的組數(shù),直接在原地交換。該算法的基本思想和 Fisher 類似,每次從未處理的數(shù)據(jù)中隨機(jī)取出一個(gè)數(shù),并和最后一個(gè)剩余元素交換,然后剩余元素的數(shù)量減一。
function randomArray(arr) { const length = arr.length for (let index = length - 1; index > 0; index--) { const random = Math.floor(Math.random() * index) const temp = arr[index] arr[index] = arr[random] arr[random] = temp } return arr }Inside-Out Algorithm
Inside-Out Algorithm 算法的思想是從前往后,借助舊數(shù)組,將新數(shù)組中位置 k 和位置 i 的數(shù)字進(jìn)行交互。
描述
拷貝數(shù)組
從 i(0 - N)掃描數(shù)組,選擇一個(gè)隨機(jī)數(shù) k( 0 <= k <= i)
新數(shù)組的[i] = 新數(shù)組的[k], 新數(shù)組的[k] = 原始數(shù)組[i]
重復(fù)第 2 步,直到末尾
最終的新數(shù)組就是隨機(jī)的
function randomArray(arr) { let newArr = arr.concat([]) const length = arr.length for (let index = 0; index < length; index++) { const random = Math.floor(Math.random() * (index + 1)) newArr[index] = newArr[random] newArr[random] = arr[index] } return newArr }參考
三種洗牌算法 shuffle
Fisher–Yates shuffle From Wikipedia
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/104294.html
摘要:百度文庫洗牌算法提到一種換牌思路隨機(jī)交換兩個(gè)位置,共交換次,越大,越接近隨機(jī)。洗牌插牌法優(yōu)化版,可以用數(shù)學(xué)歸納法證明,這種洗牌是均勻的。每次生成一張最大的牌,與隨機(jī)的某張牌換位子抽牌抽牌優(yōu)化換牌插牌插牌優(yōu)化文章轉(zhuǎn)載自隨機(jī)問題之洗牌算法 洗牌算法是我們常見的隨機(jī)問題,在玩游戲、隨機(jī)排序時(shí)經(jīng)常會(huì)碰到。它可以抽象成這樣一個(gè)問題。 得到一個(gè)M以內(nèi)的所有自然數(shù)的隨機(jī)順序數(shù)組。 在百度搜洗牌算法,...
摘要:代碼實(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...
摘要:的結(jié)果與原書的結(jié)果不符。上一篇程序員的算法趣題欲速則不達(dá)程序員的算法趣題欲速則不達(dá)下一篇程序員的算法趣題同時(shí)結(jié)束的沙漏本系列總目錄參見程序員的算法趣題詳細(xì)分析和全解程序員的算法趣題詳細(xì)分析和全解 目錄 1. 問題描述 ?2. 解題分析 2.1 思路1 2.2 思路2 3. 代碼及測(cè)試 4....
摘要:隨機(jī)洗牌算法說實(shí)話,以前理解數(shù)組的排序,都是將數(shù)組按照一定的邏輯由大到小或者由小到大排序,我自己是沒有碰到過隨機(jī)打亂數(shù)組排序的問題。然后里用的是所謂的洗牌算法,很高效。總結(jié)又是三個(gè)知識(shí)點(diǎn),分別是隨機(jī)洗牌分組和函數(shù)的實(shí)現(xiàn),沒什么復(fù)雜的。 這是第三篇關(guān)于 Underscore 的源碼解讀,最近一段時(shí)間學(xué)的東西很少,自己太忙了,一方面忙著找實(shí)習(xí),晚上回去還要寫畢業(yè)論文。畢業(yè)論文真的很憂傷,因...
摘要:首先通過數(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í)際上究...
閱讀 3044·2021-09-08 10:43
閱讀 1037·2019-08-30 15:53
閱讀 983·2019-08-30 13:51
閱讀 846·2019-08-29 14:03
閱讀 805·2019-08-26 18:35
閱讀 1236·2019-08-26 13:38
閱讀 1586·2019-08-26 10:34
閱讀 3503·2019-08-26 10:21