将不重复的随机数添加到数组中

Adding non-repeating random numbers to an array

您好,我正在尝试从非重复随机数创建一个数组。

我在下面写了代码 numberOfAnimals,目前 10 显示数组中有多少数字。当我在操场上 运行 这个时,我得到

"[6, 5, 1, 4, 7, 0]\n" 作为 print 语句的输出,所以总共有 6 个数字而不是 10 个。为了避免这种情况,我减少了 i 的值if 如果数组中已经存在随机数的语句,在这种情况下 for 循环需要一个额外的循环才能达到 10 但它仍然不起作用。

你能检查一下错误在哪里或者给我另一个可行的代码建议吗?

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)

为什么不使用 while 循环直到数组中有十个数字。

while array.count < 10 {
...

  if !array.contains(randomNumber) {
    array.append(randomNumber)
  }
}

如果你重复你的循环直到每个数字都被命中,你的算法的最坏情况运行时间是无限的。据我了解你的问题,你有一个固定大小和固定元素的数组,你想对其进行洗牌,那么为什么不这样做呢?我在 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)

如果您能负担得起额外的 space 并实现一个集合,我建议对@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)