我似乎在我的Swift代码中有一个无限的while循环,我无法弄清楚为什么

问题描述 投票:-1回答:2
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
}
swift loops while-loop repeat infinite
2个回答
0
投票

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
}

这种方式永远不会重复,并且您的锅炉代码更少。

可能有更好的方法涉及集合,但很抱歉我对此并不了解。


0
投票

一些东西:

  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超过520的可能性的51倍。你想做一个Fisher-Yates shuffle,就像内置的shuffled例程一样,来生成一个真正均匀分布的值系列。只需生成可能值的数组并将其洗牌。
© www.soinside.com 2019 - 2024. All rights reserved.