比如我們有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 ...