我的 Swift 代码中似乎有一个无限的 while 循环,我不知道为什么


var array: [Int] = []
//Here I make an array to try to dictate when to perform an IBaction.
func random() -> Int {
   let rand = arc4random_uniform(52)*10+10
    return Int(rand)
} 
//this function makes a random integer for me

func finalRand() -> Int {
    var num = random()
    while (array.contains(num) == true){
        if (num == 520){
            num = 10
        }else {
            num += 10
        }
    }
    array.append(num)
    return num
}

while语句中的逻辑有些混乱,但是您可以尝试以下操作:

var array:Array<Int> = []
func finalRand() -> Int {
    var num = Int(arc4random_uniform(52)*10+10)
    while array.contains(num) {
        num = Int(arc4random_uniform(52)*10+10)
    }
    array.append(num)
    return num
}

这样,永远不会重复,您的锅炉代码较少。

可能有一个更好的方法涉及集,但对不起,我对此并不了解。

几件事:

  1. 一旦您的数组具有所有52个值,尝试添加53个数字的尝试将最终进入无限循环,因为所有52个值已经在您的数组中。

  2. 在当代Swift版本中,您可以将random例程简化为

    func random() -> Int {
        return Int.random(in: 1...52) * 10
    }
    
  3. 看来,您可能需要一个52个不同值的洗牌数组,您可以将其简化为:

    let array = Array(1...52).map { $0 * 10 }
        .shuffled()
    

    只是通过那个洗牌阵列迭代。

    如果完成所有值后,您确实需要继续生成数字,例如,您可以重新封装数组,并从新降落的数组的开头开始。

  4. 顺便说一句,您的例程不会生成真正的随机序列。例如,让我们想象您的代码恰好填充了值10到500,其中只有510和520是最终可能的剩余值:您的例程是下一个值的510倍以510生成510的可能性。您想像内置的shuffled例行程序一样进行渔民山的混音,以产生一系列真正均匀分布的值。只是生成可能的值的数组并将其洗牌。

最新更新