Обнаружена ошибка «Неустранимая ошибка: индекс вышел за пределы диапазона» при создании случайного числа - PullRequest
1 голос
/ 28 июня 2019

Я пытаюсь создать приложение для генерации чисел бинго, однако после генерации чисел "Фатальная ошибка: индекс выпал из диапазона", случайно встречается в строке "let letter = prefixes [bingoBall / 15]".

var numbersSeen = Set<Int>()
var prefixes = ["B-", "I-", "N-", "G-", "O-"]

func randomNumber() -> Int {

    var nextNum : Int
    repeat {
        nextNum = Int.random(in: 1...75)

        if !numbersSeen.contains(nextNum) {
            numbersSeen.insert(nextNum)
            return Int(nextNum)
        }

    } while true
}

func randomBall() {
    let bingoBall = randomNumber()
    let letter = prefixes[bingoBall/15]
    lblNumber.text = "\(letter)\(bingoBall)"

    lblNumCalled.text = String(numbersSeen.count) + " numbers called."
    lblNumRemain.text = String(75 - numbersSeen.count) + " numbers remaining."

    if lblNumPrev.text != "" {
        lblNumPrev.text = lblNumPrev.text!+", "+lblNumber.text!
    }else{
        lblNumPrev.text = lblNumber.text!
    }
}

Ответы [ 3 ]

1 голос
/ 28 июня 2019

Массив Индексы, начинающиеся с нуля, деление на 15 или произвольное число может создать позицию индекса, которая недоступна, таким образом, исключение индекса вне границ.Возможное решение, которое дает вам свободу генерировать случайное число из любого заданного диапазона :

let letter = prefixes[bingoBall % numbersSeen.count]
1 голос
/ 28 июня 2019

Я думаю, что самое простое решение этой проблемы при генерировании чисел бинго в диапазоне от 1 до 75 - это вычесть единицу перед выполнением деления при доступе к буквенному массиву

let letter = prefixes[(bingoBall - 1)/15]

Это означает, что у нас есть числа в диапазоне 0-74, который при делении на 15 создает числа в диапазоне 0-4, который является допустимым диапазоном для массива размером 5

0 голосов
/ 28 июня 2019

Причина выпуска:

Поскольку индексы array начинаются с 0 , поэтому индексы prefixes array будут отличаться от 0...4.

И range, который вы используете для генерации randomNumber от 1...75.

Таким образом, bingoBall/15 даст 5, когда bingoBall = 75.

Теперь доступ к prefixes[5] приведет к Index Out of Bounds exception.

Решение:

1. Изменить range генерации randomNumber, т.е.

nextNum = Int.random(in: 1...60)

2. Измените коэффициент деления так, чтобы он приводил к значению <=4, например,

let letter = prefixes[bingoBall/18]
...