create array of random numbers in swift

前端 未结 5 2248
忘了有多久
忘了有多久 2021-02-14 19:29

I\'m just starting to learn swift. I\'m attempting to create an array of several random numbers, and eventually sort the array. I\'m able to create an array of one random number

相关标签:
5条回答
  • 2021-02-14 20:00

    In Swift 4.2 there is a new static method for fixed width integers that makes the syntax more user friendly:

    func makeList(_ n: Int) -> [Int] {
        return (0..<n).map { _ in .random(in: 1...20) }
    }
    

    Edit/update: Swift 5.1 or later

    We can also extend Range and ClosedRange and create a method to return n random elements:

    extension RangeExpression where Bound: FixedWidthInteger {
        func randomElements(_ n: Int) -> [Bound] {
            precondition(n > 0)
            switch self {
            case let range as Range<Bound>: return (0..<n).map { _ in .random(in: range) }
            case let range as ClosedRange<Bound>: return (0..<n).map { _ in .random(in: range) }
            default: return []
            }
        }
    }
    

    extension Range where Bound: FixedWidthInteger {
        var randomElement: Bound { .random(in: self) }
    }
    

    extension ClosedRange where Bound: FixedWidthInteger {
        var randomElement: Bound { .random(in: self) }
    }
    

    Usage:

    let randomElements = (1...20).randomElements(5)  // [17, 16, 2, 15, 12]
    randomElements.sorted() // [2, 12, 15, 16, 17]
    
    let randomElement = (1...20).randomElement   // 4 (note that the computed property returns a non-optional instead of the default method which returns an optional)
    

    let randomElements = (0..<2).randomElements(5)  // [1, 0, 1, 1, 1]
    let randomElement = (0..<2).randomElement   // 0
    

    Note: for Swift 3, 4 and 4.1 and earlier click here.

    0 讨论(0)
  • 2021-02-14 20:10

    Ok, this is copy/paste of a question asked elsewhere, but I think I'll try to remember that one-liner :

    var randomArray = map(1...100){_ in arc4random()}
    

    (I love it !)

    EDIT

    If you need a random number with an upperBound (exclusive), use arc4random_uniform(upperBound)

    e.g. : random number between 0 & 99 : arc4random_uniform(100)

    Swift 2 update

    var randomArray = (1...100).map{_ in arc4random()}
    
    0 讨论(0)
  • 2021-02-14 20:13

    Swift 4.2 or later

    func makeList(_ n: Int) -> [Int] {
        return (0..<n).map{ _ in Int.random(in: 1 ... 20) }
    }
    
    let list = makeList(5)  //[11, 17, 20, 8, 3]
    list.sorted() // [3, 8, 11, 17, 20]
    
    0 讨论(0)
  • 2021-02-14 20:17

    Swift 5

    This creates an array of size 5, and whose elements range from 1 to 10 inclusive.

    let arr = (1...5).map( {_ in Int.random(in: 1...10)} )
    
    0 讨论(0)
  • 2021-02-14 20:20

    How about this? Works in Swift 5 and Swift 4.2:

    public extension Array where Element == Int {
        static func generateRandom(size: Int) -> [Int] {
            guard size > 0 else {
                return [Int]()
            }
            return Array(0..<size).shuffled()
        }
    }
    

    Usage:

    let array = Array.generateRandom(size: 10)
    print(array)
    

    Prints e.g.:

    [7, 6, 8, 4, 0, 3, 9, 2, 1, 5]
    

    The above approach gives you unique numbers. However, if you need redundant values, use the following implementation:

    public extension Array where Element == Int {
        static func generateRandom(size: Int) -> [Int] {
            guard size > 0 else {
                return [Int]()
            }
            var result = Array(repeating: 0, count: size)
            for index in 0..<result.count {
                result[index] = Int.random(in: 0..<size)
            }
            return result
        }
    }
    

    A shorter version of the above using map():

    public extension Array where Element == Int {
        static func generateRandom(size: Int) -> [Int] {
            guard size > 0 else {
                return [Int]()
            }
            var result = Array(repeating: 0, count: size)
            return result.map{_ in Int.random(in: 0..<size)}
        }
    }
    
    0 讨论(0)
提交回复
热议问题