Swift如何快速隨機化陣列中的元素
阿新 • • 發佈:2019-01-06
隨機化陣列元素或稱為”洗牌”,是比較常用的演算法,常常應用到一些遊戲中.
在Swift中我們可以有很多種選擇.這裡我只說兩種:一種是擴充套件Array的功能,另外一種是利用GameplayKit中的內建方法.
首先上程式碼:
extension Array{
mutating func shuffle(){
for i in 0..<(count-1){
let j = Int(arc4random_uniform(UInt32(count-i)))+i
swap(&self[i], &self[j])
}
}
}
在Xcode8.0的playground中執行,咦,怎麼出錯了!?
fatal error: swapping a location with itself is not supported
其原因為swip不能交換同一個地址的元素,所以你在交換之前要做判斷,在swap(&self[i], &self[j])一句用if語句包圍住即可:
if i != j{
swap(&self[i], &self[j])
}
這種方法將會改變陣列物件本身.
下面我們import GameplayKit後,利用GameplayKit中的arrayByShufflingObjects方法也可以完成隨機陣列元素的任務,不過這次你會得到一個隨機後陣列的拷貝,原來的陣列物件保持不變:
var ary = Array(1..<10)
var aryCopy = ary
ary.shuffle()
let shuffleAry = GKRandomSource.sharedRandom().arrayByShufflingObjects(in: aryCopy)
aryCopy