2015-09-21 18 views
9

Tôi có phần mở rộng này sẽ tạo ra một mảng mới mà có nhóm các mảng ngẫu nhiên từ mảng:lỗi nghiêm trọng: trao đổi một vị trí với bản thân không được hỗ trợ với Swift 2.0

extension Array { 
    var shuffle:[Element] { 
     var elements = self 
     for index in 0..<elements.count { 
      swap(&elements[index], &elements[ Int(arc4random_uniform(UInt32(elements.count-index)))+index ]) 
     } 
     return elements 
    } 
    func groupOf(n:Int)-> [[Element]] { 
     var result:[[Element]]=[] 
     for i in 0...(count/n)-1 { 
      var tempArray:[Element] = [] 
      for index in 0...n-1 { 
       tempArray.append(self[index+(i*n)]) 
      } 
      result.append(tempArray) 
     } 

     return result 
    } 
} 

Và tôi đang sử dụng nó như này:

let mainArr = Array(1...60) 
let suffeldArr = mainArr.shuffle.groupOf(10) 
print(suffeldArr) 

Và nó sẽ in như:

[[10 random element between 1 to 60], [10 random element between 1 to 60], [10 random element between 1 to 60], [10 random element between 1 to 60], [10 random element between 1 to 60], [10 random element between 1 to 60]] 

Nhưng nó đem lại cho tôi một lỗi lúc chạy tim e ở dòng này:

swap(&elements[index], &elements[ Int(arc4random_uniform(UInt32(elements.count-index)))+index ]) 

Mà nói:

fatal error: swapping a location with itself is not supported

Nó được làm việc tốt trong 1.2 nhưng bây giờ nó không được làm việc trong 2.0.

Tôi không biết cách giải quyết vấn đề này.

+0

Note rằng mã trong http://stackoverflow.com/a/24029847/1187415 đã được cập nhật để khắc phục vấn đề này: http://stackoverflow.com/questions/24026510/how-do-i-shuffle-an-array-in -swift/24029847 # comment52863556_24029847 –

+0

Cảm ơn ... @MartinR –

Trả lời

11

Bạn đang cố gắng để trao đổi một phần tử với bản thân, bạn sẽ cần phải thực hiện một kiểm tra để xem nếu bạn không cố gắng để trao đổi một yếu tố để cùng một chỗ trong mảng, như vậy:

extension Array { 
    var shuffle:[Element] { 
     var elements = self 
     for index in 0..<elements.count { 
      let newIndex = Int(arc4random_uniform(UInt32(elements.count-index)))+index 
      if index != newIndex { // Check if you are not trying to swap an element with itself 
       swap(&elements[index], &elements[newIndex]) 
      } 
     } 
     return elements 
    } 
    func groupOf(n:Int)-> [[Element]] { 
     var result:[[Element]]=[] 
     for i in 0...(count/n)-1 { 
      var tempArray:[Element] = [] 
      for index in 0...n-1 { 
       tempArray.append(self[index+(i*n)]) 
      } 
      result.append(tempArray) 
     } 

     return result 
    } 
} 
+0

Có nó hoạt động !! Cảm ơn sự giúp đỡ .. :) –

+0

@DharmeshKheni cũng kiểm tra câu trả lời này cho một thuật toán xáo trộn Fisher-Yates sạch sẽ và đơn giản: http://stackoverflow.com/a/24029847/1009013 – vrwim

+0

có Martin đã gợi ý rằng .. :) –

Các vấn đề liên quan