【问题标题】:Swift: Make sure no two arrays are the sameSwift:确保没有两个数组是相同的
【发布时间】:2016-05-09 17:49:20
【问题描述】:

我随机创建具有 4 个随机数 (1-4) 的不同数组。但是我如何确保没有两个数组是相同的呢?

例如:[1,2,3,4], [4,3,2,1], [1,2,2,1], [1,2,3,4]

这是我的代码,但我认为它不起作用,因为有几次我会看到两个相同的数组...

func randomNumbersArray(i: UInt32) -> [Int] {
    let r = [Int(arc4random_uniform(i) + 1),
             Int(arc4random_uniform(i) + 1),
             Int(arc4random_uniform(i) + 1),
             Int(arc4random_uniform(i) + 1)]
    return r
}

func arrays() {
    let main = randomNumbersArray(4)
    qArray = main
    aArray = main
    bArray = randomNumbersArray(4)
    cArray = randomNumbersArray(4)
    dArray = randomNumbersArray(4)

    if aArray == bArray || aArray == cArray || aArray == dArray ||
        bArray == cArray || bArray == dArray || cArray == dArray {
        bArray = randomNumbersArray(4)
        cArray = randomNumbersArray(4)
        dArray = randomNumbersArray(4)
    }
    print(aArray)
    print(bArray)
    print(cArray)
    print(dArray)
}

【问题讨论】:

  • 如果事情是随机的,它们可能会重复——这是正常的随机行为。此外,其中包含 1-4 个的唯一数组并不多。当你用完时会发生什么?
  • @LouFranco 嗯,有 256 个,如果您只需要 4 个,那还不错。从技术上讲,您可以在 0..255 范围内生成 4 个数字并从这些数字生成数组(每两位代表一个数字)。也完全可以预先生成所有数组,然后从它们中随机选择。

标签: arrays swift random arc4random


【解决方案1】:

应该这样做:

func randomNumbersArray(i: UInt32) -> [Int] {
    let r = [Int(arc4random_uniform(i) + 1),
             Int(arc4random_uniform(i) + 1),
             Int(arc4random_uniform(i) + 1),
             Int(arc4random_uniform(i) + 1)]
    return r
}

func arrays() {
    var randArrays = [[Int]]()

    repeat {
        let newArray = randomNumbersArray(4)

        if !randArrays.contains{ $0 == newArray } {
            randArrays.append(newArray)
        }
    } while randArrays.count < 4

    //...
}

【讨论】:

  • 要明确:随着i 的值减少,这将导致性能越来越差,如果您尝试创建比i 的给定值更多的唯一数组,甚至会无限循环.
  • 稍作调整,就可以完美运行。谢谢!
  • 另外,当您提前知道Array 的大小时,最好使用` init(count:repeatedValue:)` 初始化程序来预分配大小。它在这里并不那么重要(大小只有 4),但对于较大的数组来说这是一个很好的做法。
【解决方案2】:

制作一个数组来存储您的数组。每当你生成一个新数组时,检查.contains(_:),并继续生成新数组直到它是false

【讨论】:

    猜你喜欢
    • 2017-11-09
    • 2018-01-22
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2014-02-03
    相关资源
    最近更新 更多