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

Posted

技术标签:

【中文标题】在 Swift 中创建一个随机数数组【英文标题】:Create an array of random numbers in Swift 【发布时间】:2015-01-25 18:53:10 【问题描述】:

我刚刚开始学习 Swift。

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

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

    let numList = Array(arrayLiteral: randomNums)



makeList()

【问题讨论】:

定义“几个”,你知道“for循环”吗? 是的,我知道 javascript 中的 for 循环。我想我想创建一个迭代 5 次的 for 循环,只是为了举例。 shortest code to create an array of random numbers in swift? 的可能重复项 【参考方案1】:

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

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

编辑/更新:Swift 5.1 或更高版本

我们还可以扩展RangeClosedRange 并创建一个返回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。

【讨论】:

【参考方案2】:

好的,这是a question asked elsewhere 的复制/粘贴,但我想我会尽量记住这一行:

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

(我喜欢它!)

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

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

Swift 2 更新

var randomArray = (1...100).map_ in arc4random()

【讨论】:

您如何将其限制为仅获得 10 个数字?但使用 map(1...100) 最好是 10 个唯一数字(不重复) 等待上面的字面意思是随机数。如100个随机数元素[1852894657、278174301、2558743979、3659809261、1696046131、2549863704、1571828145] 你说得对,我使用的是arc4random()函数,但你可以使用arc4random_uniform(100)。答案已编辑! 如果你执行 arc4random_uniform(100),那么 map(1...100) 是什么意思 arc4random_uniform(100) 返回一个 SINGLE 随机数。 1...100 是一个范围(为了便于理解,将其视为一个数组)。还有map ...好吧,这是地图功能! (寻找函数式编程以了解更多信息)。它适用于范围的所有成员。因此,1 到 100 之间的每个数字都映射到 0 到 99 之间的随机数。等等:你有一个 0 到 99 之间的 100 个随机数的数组! :) 请参阅我在答案中提供的 SO 链接以获得进一步的解释。【参考方案3】:

斯威夫特 5

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

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

【讨论】:

【参考方案4】:

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]

【讨论】:

【参考方案5】:

这个怎么样? 适用于 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 中创建一个随机数数组的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用 OpenCV 从随机数组中创建 RGB 图片

如何使用图像视图从图像数组中创建随机图像生成器?

在 C 中创建大型数组时出现分段错误

在Java中创建一个带有A-Z和0-9的随机字符串[重复]

分段错误:在 Mac 上为 11,但在 Linux 上没有,同时在 C 中创建数组

如何在clojure中创建一个惰性随机数序列