Knuth 和Durstenfeld 在Fisher 等人的基礎上對算法進行了改進。 每次從未處理的數據中隨機取出一個數字,然後把該數字放在數組的尾部,即數組尾部存放的是已經處理過的數字 。這是一個原地打亂順序的算法,算法時間複雜度也從Fisher算法的 O ( n 2 )提升到了 O ( n )。
//************* 洗牌算法 ************
// [1 8]下面的方法是隨機 1到 8之間的一個數
var nameArr = [2, 4, 45, 44]
func getRandomByQuJian(startIndex:Int, endIndex:Int)->Int {
let index2 = Int(arc4random_uniform(UInt32(endIndex - startIndex)) + UInt32(startIndex))
return index2
}
func getRandomByArr(arrValue:inout [Int]){
// 遍歷每個數據源
for i in 0..<arrValue.count {
let index1:Int = getRandomByQuJian(startIndex:i,endIndex:arrValue.count-1)
// 這個方法是交換 數組中兩個數據的位置,最後達到數據打亂的目的
(arrValue[i], arrValue[index1]) = (arrValue[index1], arrValue[i])
//查看當前位置
print( i,index1)
print(arrValue)
}
}
print("值:\(getRandomByArr(arrValue: &nameArr)) ")