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

时间:2019-02-24 19:15:22

标签: swift loops while-loop repeat infinite

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
}

2 个答案:

答案 0 :(得分: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
}

这样,就不会重复,而且锅炉代码也更少。

可能有一个更好的方法涉及Sets,但是很抱歉,我对此了解不多。

答案 1 :(得分:0)

几件事:

  1. 一旦数组具有所有52个值,由于所有52个值都已存在于数组中,因此尝试添加第53个数字将导致无限循环。

  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是最终可能的剩余值:对于下一个值,您的例程生成520的可能性是520的51倍。您希望像内置shuffled例程那样进行Fisher-Yates随机播放,以生成真正均匀分布的一系列值。只需生成可能值的数组并对其进行随机排序即可。