将非重复随机数添加到数组中

时间:2018-02-11 19:22:07

标签: arrays swift shuffle

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

我在下面写了代码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}}

3 个答案:

答案 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)