Кажется, у меня в коде Swift бесконечный цикл while, и я не могу понять, почему - PullRequest
0 голосов
/ 24 февраля 2019
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 голосов
/ 25 февраля 2019

Несколько вещей:

  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 являются последними возможными оставшимися значениями: ваша процедура с вероятностью в 51 раз сгенерирует 510 более 520 для следующего значения.Вы хотите выполнить случайное перемешивание Фишера-Йейтса, как это делает встроенная подпрограмма shuffled, для генерации действительно равномерно распределенной серии значений.Просто сгенерируйте массив возможных значений и перемешайте его.

0 голосов
/ 24 февраля 2019

Логика в выражении 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, но мне жаль, что я мало что знаю об этом.

...