如何使30个不同的唯一随机数组成数组?

时间:2018-07-31 17:29:28

标签: arrays swift random

我想使用arc4random来生成30个不同数字的数组,因此其中没有重复。我该怎么办?

4 个答案:

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

因此,randomArrayInt的数组,包含从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
}