在 Swift 中从范围生成唯一随机数列表

Kaz*_*mun 1 random arc4random swift

我想编写一个应该返回整数列表的函数。整数列表大小和最大随机数将由用户定义,用户将通过函数参数传递。我的特殊要求是,列表中的整数不能是多余的。
我的方法使用Array

func getRandomNumbers(maxNumber: Int, listSize: Int)-> [Int]{
    var randomNumbers = [Int]()
    for _ in 1...listSize{
        let randomNumber = Int(arc4random_uniform(UInt32(listSize)))
        randomNumbers.append(randomNumber)
    }
    return randomNumbers
}
Run Code Online (Sandbox Code Playgroud)

问题:有时我用这种方法得到重复的值。
我知道 swiftSet不具有重复值。

我的方法使用Set

func getRandomNumbers(maxNumber: Int, listSize: Int)-> Set<Int>{
    var randomNumbers = Set<Int>()
    for _ in 1...listSize{
        let randomNumber = Int(arc4random_uniform(UInt32(listSize)))
        randomNumbers.insert(randomNumber)
    }
    return randomNumbers
} 
Run Code Online (Sandbox Code Playgroud)

问题:有时Set尺寸小于用户定义的尺寸。

Ale*_*tev 6

Swift 5 版本实现

extension Int {

    static func getUniqueRandomNumbers(min: Int, max: Int, count: Int) -> [Int] {
        var set = Set<Int>()
        while set.count < count {
            set.insert(Int.random(in: min...max))
        }
        return Array(set)
    }

}
Run Code Online (Sandbox Code Playgroud)

例如:

let uniqueNumbers = Int.getUniqueRandomNumbers(min: 1000, max: 1500, count: 10)
Run Code Online (Sandbox Code Playgroud)

结果示例:

[1454, 1105, 1305, 1176, 1498, 1127, 1310, 1209, 1373, 1198]
Run Code Online (Sandbox Code Playgroud)