1. 程式人生 > >Swift如何快速隨機化陣列中的元素

Swift如何快速隨機化陣列中的元素

隨機化陣列元素或稱為”洗牌”,是比較常用的演算法,常常應用到一些遊戲中.

在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