How do I shuffle an array in Swift?

前端 未结 25 2192
长发绾君心
长发绾君心 2020-11-21 05:44

How do I randomize or shuffle the elements within an array in Swift? For example, if my array consists of 52 playing cards, I want to shuffle the array in o

相关标签:
25条回答
  • 2020-11-21 06:35

    This is a version of Nate's implementation of the Fisher-Yates shuffle for Swift 4 (Xcode 9).

    extension MutableCollection {
        /// Shuffle the elements of `self` in-place.
        mutating func shuffle() {
            for i in indices.dropLast() {
                let diff = distance(from: i, to: endIndex)
                let j = index(i, offsetBy: numericCast(arc4random_uniform(numericCast(diff))))
                swapAt(i, j)
            }
        }
    }
    
    extension Collection {
        /// Return a copy of `self` with its elements shuffled
        func shuffled() -> [Element] {
            var list = Array(self)
            list.shuffle()
            return list
        }
    }
    

    The changes are:

    • The constraint Indices.Iterator.Element == Index is now part of the Collection protocol, and need not be imposed on the extension anymore.
    • Exchanging elements must done by calling swapAt() on the collection, compare SE-0173 Add MutableCollection.swapAt(_:_:).
    • Element is an alias for Iterator.Element.
    0 讨论(0)
  • 2020-11-21 06:35

    This is how its done in a Simplest way.import Gamplaykit to your VC and use the below code. Tested in Xcode 8.

     import GameplayKit
    
     let array: NSArray = ["Jock", "Ellie", "Sue Ellen", "Bobby", "JR", "Pamela"]
    
     override func viewDidLoad() {
        super.viewDidLoad()
    
        print(array.shuffled())  
    }
    

    If you want to get a shuffled String from an Array you can use below code..

    func suffleString() {
    
        let ShuffleArray = array.shuffled()
    
        suffleString.text = ShuffleArray.first as? String
    
        print(suffleString.text!)
    
    }
    
    0 讨论(0)
  • 2020-11-21 06:35

    works!!. organisms is the array to shuffle.

    extension Array
    {
        /** Randomizes the order of an array's elements. */
        mutating func shuffle()
        {
            for _ in 0..<10
            {
                sort { (_,_) in arc4random() < arc4random() }
            }
        }
    }
    
    var organisms = [
        "ant",  "bacteria", "cougar",
        "dog",  "elephant", "firefly",
        "goat", "hedgehog", "iguana"]
    
    print("Original: \(organisms)")
    
    organisms.shuffle()
    
    print("Shuffled: \(organisms)")
    
    0 讨论(0)
  • 2020-11-21 06:36

    Taking Nate's algorithm I wanted to see how this would look with Swift 2 and protocol extensions.

    This is what I came up with.

    extension MutableCollectionType where Self.Index == Int {
        mutating func shuffleInPlace() {
            let c = self.count
            for i in 0..<(c - 1) {
                let j = Int(arc4random_uniform(UInt32(c - i))) + i
                swap(&self[i], &self[j])
            }
        }
    }
    
    extension MutableCollectionType where Self.Index == Int {
        func shuffle() -> Self {
            var r = self
            let c = self.count
            for i in 0..<(c - 1) {
                let j = Int(arc4random_uniform(UInt32(c - i))) + i
                swap(&r[i], &r[j])
            }
            return r
        }
    }
    

    Now, any MutableCollectionType can use these methods given it uses Int as an Index

    0 讨论(0)
  • 2020-11-21 06:36

    This is what I use:

    func newShuffledArray(array:NSArray) -> NSArray {
        var mutableArray = array.mutableCopy() as! NSMutableArray
        var count = mutableArray.count
        if count>1 {
            for var i=count-1;i>0;--i{
                mutableArray.exchangeObjectAtIndex(i, withObjectAtIndex: Int(arc4random_uniform(UInt32(i+1))))
            }
        }
        return mutableArray as NSArray
    }
    
    0 讨论(0)
  • 2020-11-21 06:36

    This is how to shuffle one array with a seed in Swift 3.0.

    extension MutableCollection where Indices.Iterator.Element == Index {
        mutating func shuffle() {
            let c = count
            guard c > 1 else { return }
    
    
            for (firstUnshuffled , unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) {
                srand48(seedNumber)
                let number:Int = numericCast(unshuffledCount)
                let r = floor(drand48() * Double(number))
    
                let d: IndexDistance = numericCast(Int(r))
                guard d != 0 else { continue }
                let i = index(firstUnshuffled, offsetBy: d)
                swap(&self[firstUnshuffled], &self[i])
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题