在 Swift 中创建一个随机数数组

Create an array of random numbers in Swift

我刚开始学习Swift。

我正在尝试创建一个包含多个随机数的数组,并最终对数组进行排序。我能够创建一个随机数数组,但迭代它以创建多个随机数数组的最佳方法是什么?

func makeList() {
   var randomNums = arc4random_uniform(20) + 1

    let numList = Array(arrayLiteral: randomNums)

}

makeList()

Swift 4.2中有一个新的固定宽度整数的静态方法,使语法更加用户友好:

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

Edit/update: Swift 5.1 或更高版本

我们还可以扩展 RangeClosedRange 并创建一个方法来 return n 随机元素:

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) }
}

用法:

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

注意:对于 Swift 3、4 和 4.1 及更早版本,请单击 here

好的,这是 的 copy/paste,但我想我会尽量记住那一行:

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

(我喜欢!)

如果你需要一个带upperBound(不包括)的随机数,使用arc4random_uniform(upperBound)。

例如:0到99之间的随机数:arc4random_uniform(100)

Swift 2 次更新

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

Swift 4.2 或更高版本

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]

这个怎么样? 适用于 Swift 5 和 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()
    }
}

用法:

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

打印例如:

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

上述方法为您提供了唯一编号。但是,如果您需要冗余值,请使用以下实现:

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
    }
}

上面使用 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)}
    }
}

Swift 5

这将创建一个大小为 5 的数组,其元素范围为 1 到 10(含)。

let arr = (1...5).map( {_ in Int.random(in: 1...10)} )