您好我正在尝试使用非重复随机数创建一个数组。
我在下面写了代码i
,其中10代表当前显示数组中有多少个数字。当我在操场上跑步时,我得到了
“[6,5,1,4,7,0] \ n”作为print语句的输出,所以共有6个数而不是10个。为了避免它,我在{if
的值减去import UIKit
var array = [Int]()
var max : Int = 10
var numberOfAnimals : Int = 10
for var i in 0..<numberOfAnimals {
let randomNumber : Int = Int(arc4random_uniform(UInt32(max)))
if array.contains(randomNumber) {
i = i - 1
} else {
array.append(randomNumber)
}
}
print(array)
1}}语句以防数组中已存在随机数,在这种情况下,for循环需要一个额外的循环来达到10但仍然不起作用。
您能否查看错误的位置或给我另一个可行的代码建议?
{{1}}
答案 0 :(得分:0)
为什么没有一个while循环继续,直到你的数组中有十个数字。
while array.count < 10 {
...
if !array.contains(randomNumber) {
array.append(randomNumber)
}
}
答案 1 :(得分:0)
如果重复循环直到每个数字都被击中,算法的最坏情况运行时是无限的。到目前为止,我理解你的问题,你有一个固定大小和固定元素的数组,你想要洗牌,所以为什么不这样做?我在another thread中找到了一个不错的算法:
extension MutableCollection {
mutating func shuffle() {
let c = count
guard c > 1 else { return }
for (firstUnshuffled, unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) {
let d: IndexDistance = numericCast(arc4random_uniform(numericCast(unshuffledCount)))
let i = index(firstUnshuffled, offsetBy: d)
swapAt(firstUnshuffled, i)
}
}
}
let numberOfAnimals = [1,2,3,4,5,6,7,8,9,10]
array.shuffle()
print(array)
答案 2 :(得分:0)
我建议稍微修改@Joakim Danielson的答案,如果你能负担得起额外的空间并实施一套 - 如果一个阵列不是至关重要的,你可能要考虑一套供你实施的,只需0.02美元
var array = [Int]()
var seen = Set<Int>()
let max = 10
while array.count < max {
let number = Int(arc4random_uniform(UInt32(max)))
if seen.contains(number) {
continue
}
array.append(number)
seen.insert(number)
}
print(array)