我想使用arc4random
来生成30个不同数字的数组,因此其中没有重复。我该怎么办?
答案 0 :(得分:1)
这可能是一个沉重的动作,但您可以这样做:
var randomNumbers: [Int] = []
while randomNumbers.count != 30{
let number = Int(arc4random_uniform(1000) + 1)
if randomNumbers.contains(number) {
print("Already Exits")
}else{
randomNumbers.append(number)
}
}
将“ 1000”替换为所需的数字范围。该函数在0 ... 1000
之间生成了30个不同的数字答案 1 :(得分:1)
感谢@Sulthan的优雅思想(在Gereon's answer上发表了评论):
无论如何,取决于限制和数量之间的差异 生成的元素可能会具有糟糕的性能。问题 当限制接近生成的元素数时就是这种情况。 那么最好采用
1..<limit
并将其洗牌。
这意味着甚至不需要生成随机Int
。我想到的最简单的方法是按照( Swift 4.2 ):
let randoms = Array(0..<30).shuffled()
因此,randoms
是一个Int
的数组,包含30个从0到29的唯一值。
少于Swift 4.2:
但是,如果您不使用Swift 4.2,我建议您检查this great answer以获得改组的集合。
您可以这样实现:
var uniques = Set<UInt32>()
func generateUniqueUInt32() -> UInt32 {
let random = arc4random_uniform(31)
if !uniques.contains(random) {
uniques.insert(random)
return random
} else {
return generateUniqueUInt32()
}
}
let randomArray = Array(0..<30).map { _ in Int(generateUniqueUInt32()) }
因此,randomArray
是Int
的数组,包含从0到29的30个唯一值。
Swift 4.2:
您应该替换:
let random = arc4random_uniform(31)
具有:
let random = Int.random(in: 1..<30)
这意味着generateUniqueUInt32
应该直接返回-Int
(并重命名为generateUniqueInt
):
func generateUniqueInt() -> Int {
let random = Int.random(in: 1..<30)
if !uniques.contains(random) {
uniques.insert(random)
return random
} else {
return generateUniqueInt()
}
}
let randomArray = Array(0..<30).map { _ in generateUniqueInt() }
答案 2 :(得分:0)
使用Set
存储到目前为止生成的数字
func thirtyUniqueRandomNumbers(_ limit: Int) -> [Int] {
var randoms = Set<Int>()
repeat {
let rnd = Int(arc4random_uniform(UInt32(limit)))
if !randoms.contains(rnd) {
randoms.insert(rnd)
}
} while randoms.count < 30
return randoms.map { $0 }
}
答案 3 :(得分:0)
这是一个简单的解决方案。启动while
循环。在此循环内生成一个随机数(0到1000之间)。如果数组中不包含数字,则将其添加到数组中。
func generateArrayOfRandomNumbers() -> [Int] {
var array: [Int] = []
while array.count < 30 {
let randomInt = Int.random(in: 0...1000)
guard !array.contains(randomInt) else { continue }
array.append(randomInt)
}
return array
}