洗牌演算法 javascript實現

2021-08-20 21:33:04 字數 1452 閱讀 5943

比如我們有52張牌,現在的需求就是洗牌(俗名打亂順序 - -!)

先構造乙個陣列:

const nums

= ['a',

1,2,

3,4,

5,6,

7,8,

9,'j

','q

','k

'] const signs

= ['♥️',

'♦️',

'♣️',

'♠️']

const cards

= signs

.foreach(

sign

=>)

}) })

這樣cards 就構造完成了,但是js這樣寫很low,但是我覺得很快就想出來了,我們換一種其他優雅一點的方法(下面這段**的作者是 月影):

function

*getcards

()))

yield

* nums

.map(

num=>(

))yield

* nums

.map(

num=>(

))yield

* nums

.map(

num=>(

)) }

const cards

= [...

getcards()]

上面生成器的key point有兩點:

// key point -01

...擴充套件運算子 內部呼叫的是資料結構的iterator介面,生成器返回的就是乙個iterator物件,即遍歷器物件

對這個遍歷器物件執行擴充套件運算子 ... 就會將內部遍歷到的值轉為乙個陣列

// key point -02

任何資料結構只要有iterator介面,就可以用yield * 來遍歷

let readstr = (function* ()())

readstr.next().value 這一句會輸出 字元'h'

如果你寫乙個執行器把這個生成器執行完畢,你會發現會依次將這個字串的單個字元給輸出

好到現在為止,準備工作做完了,cards陣列我們已經有了,現在我們來洗牌

// 洗牌

function

shuffle

(cards

) return cards }

其實感覺在遍歷陣列的時候改變陣列不太好,可以返回乙個新的陣列更好一點,當然也看實際的需求。

// 強制複習一下

const params

= (function

*())()

yield

* [ 5,6

,7]yield*'

abc'

// yield *

})()

console

.log([

...params])

每日演算法 洗牌演算法

給定乙個n個數的序列,設計乙個演算法將其隨機打亂,保證每個數出現在任意乙個位置的概率相同 也就是說在n 個的排列中,每乙個排列出現的概率相同 假設輸入為陣列num length 隨機選乙個數,放到num 0 中,再隨機選數,如果該數已經選過,重新選,直到該數未選過時放入num 1 中,以此類推,直到...

洗牌演算法小結

1.for i 1 to n do swap a i a random 1,n 湊合,但不是真正隨機 2.for i 1 to n do swap a i a random i,n 真正的隨機演算法 其中,random a,b 函式用於返回乙個從a到b 包括a和b 的隨機整數。第乙個 概率事件總的發...

隨機洗牌演算法

問題 給定乙個有序序列1 n,要你將其完全打亂,要求每個元素在任何乙個位置出現的概率均為1 n。解決方案 依次遍歷陣列,對第n個元素,以1 n的概率與前n個元素中的某個元素互換位置,最後生成的序列即滿足要求,1 n的概率可通過rand n實現。見如下程式 void swap int p,int q ...