Сделать arc4random, более случайным? - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь, чтобы в моей викторине появлялись случайные вопросы.Прямо сейчас я использую arc4random(), чтобы получить случайное число для оператора switch, и это то, что отображается на кнопках и надписях, но ему нравится дублировать вопросы.Как я могу предотвратить это или сделать так, чтобы оно дублировалось меньше?

Да, я знаю, что часто дублирую код, но сейчас я знаю, как это сделать!

func RandomQuestions() {
    var RandomNumber = arc4random() % 10
    var RandomQuestion = arc4random() % 4
    RandomQuestion += 1
    RandomNumber += 1
    Next.isHidden = true

    switch(RandomNumber) {

    case 1:
        if RandomQuestion == UInt32(1) {
            questionLabel.text = "What is the tail end of a piece of music?"
            button1.setTitle("Coda", for: UIControl.State.normal)
            button2.setTitle("Da Capo", for: UIControl.State.normal)
            button3.setTitle("Forte", for: UIControl.State.normal)
            button4.setTitle("Largo", for: UIControl.State.normal)
            CorrectAnswer = "1"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "What is the tail end of a piece of music?"
            button1.setTitle("Da Capo", for: UIControl.State.normal)
            button2.setTitle("Largo", for: UIControl.State.normal)
            button3.setTitle("Coda", for: UIControl.State.normal)
            button4.setTitle("Forte", for: UIControl.State.normal)
            CorrectAnswer = "3"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "What is the tail end of a piece of music?"
            button1.setTitle("Largo", for: UIControl.State.normal)
            button2.setTitle("Da Capo", for: UIControl.State.normal)
            button3.setTitle("Forte", for: UIControl.State.normal)
            button4.setTitle("Coda", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else {
            questionLabel.text = "What is the tail end of a piece of music?"
            button1.setTitle("Largo", for: UIControl.State.normal)
            button2.setTitle("Coda", for: UIControl.State.normal)
            button3.setTitle("Forte", for: UIControl.State.normal)
            button4.setTitle("Da Capo", for: UIControl.State.normal)
            CorrectAnswer = "2"
        }
        break
    case 2:
        if RandomQuestion == UInt32(1) {
            questionLabel.text = "Another name for Majestically?"
            button1.setTitle("Lunga", for: UIControl.State.normal)
            button2.setTitle("Dolce", for: UIControl.State.normal)
            button3.setTitle("Maestoso", for: UIControl.State.normal)
            button4.setTitle("Molto", for: UIControl.State.normal)
            CorrectAnswer = "3"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "Another name for Majestically?"
            button1.setTitle("Dolce", for: UIControl.State.normal)
            button2.setTitle("Lunga", for: UIControl.State.normal)
            button3.setTitle("Molto", for: UIControl.State.normal)
            button4.setTitle("Maestoso", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "Another name for Majestically?"
            button1.setTitle("Molto", for: UIControl.State.normal)
            button2.setTitle("Maestoso", for: UIControl.State.normal)
            button3.setTitle("Lunga", for: UIControl.State.normal)
            button4.setTitle("Dolce", for: UIControl.State.normal)
            CorrectAnswer = "2"
        } else {
            questionLabel.text = "Another name for Majestically?"
            button1.setTitle("Maestoso", for: UIControl.State.normal)
            button2.setTitle("Dolce", for: UIControl.State.normal)
            button3.setTitle("Lunga", for: UIControl.State.normal)
            button4.setTitle("Molto", for: UIControl.State.normal)
            CorrectAnswer = "1"
        }
        break
    case 3:
        if RandomQuestion == UInt32(1) {
            questionLabel.text = "Another name for Time/Speed?"
            button1.setTitle("Largo", for: UIControl.State.normal)
            button2.setTitle("Soli", for: UIControl.State.normal)
            button3.setTitle("Tenuto", for: UIControl.State.normal)
            button4.setTitle("Tempo", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "Another name for Time/Speed?"
            button1.setTitle("Soli", for: UIControl.State.normal)
            button2.setTitle("Tenuto", for: UIControl.State.normal)
            button3.setTitle("Tempo", for: UIControl.State.normal)
            button4.setTitle("Largo", for: UIControl.State.normal)
            CorrectAnswer = "3"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "Another name for Time/Speed?"
            button1.setTitle("Tempo", for: UIControl.State.normal)
            button2.setTitle("Largo", for: UIControl.State.normal)
            button3.setTitle("Soli", for: UIControl.State.normal)
            button4.setTitle("Tenuto", for: UIControl.State.normal)
            CorrectAnswer = "1"
        } else {
            questionLabel.text = "Another name for Time/Speed?"
            button1.setTitle("Largo", for: UIControl.State.normal)
            button2.setTitle("Tempo", for: UIControl.State.normal)
            button3.setTitle("Tenuto", for: UIControl.State.normal)
            button4.setTitle("Soli", for: UIControl.State.normal)
            CorrectAnswer = "2"
        }
        break
    case 4:
        if RandomQuestion == UInt32(1) {
            questionLabel.text = "Another name for Softly"
            button1.setTitle("Piano", for: UIControl.State.normal)
            button2.setTitle("Forte", for: UIControl.State.normal)
            button3.setTitle("Segno", for: UIControl.State.normal)
            button4.setTitle("Tacet", for: UIControl.State.normal)
            CorrectAnswer = "1"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "Another name for Softly"
            button1.setTitle("Forte", for: UIControl.State.normal)
            button2.setTitle("Tacet", for: UIControl.State.normal)
            button3.setTitle("Piano", for: UIControl.State.normal)
            button4.setTitle("Segno", for: UIControl.State.normal)
            CorrectAnswer = "3"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "Another name for Softly"
            button1.setTitle("Tacet", for: UIControl.State.normal)
            button2.setTitle("Segno", for: UIControl.State.normal)
            button3.setTitle("Forte", for: UIControl.State.normal)
            button4.setTitle("Piano", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else {
            questionLabel.text = "Another name for Softly"
            button1.setTitle("Forte", for: UIControl.State.normal)
            button2.setTitle("Piano", for: UIControl.State.normal)
            button3.setTitle("Segno", for: UIControl.State.normal)
            button4.setTitle("Tacet", for: UIControl.State.normal)
            CorrectAnswer = "2"
        }
        break
    case 5:
        if RandomQuestion == UInt32(1) {
            questionLabel.text = "Another name for Really Fast?"
            button1.setTitle("Staccato", for: UIControl.State.normal)
            button2.setTitle("Fermata", for: UIControl.State.normal)
            button3.setTitle("Presto", for: UIControl.State.normal)
            button4.setTitle("Mezzo", for: UIControl.State.normal)
            CorrectAnswer = "3"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "Another name for Really Fast?"
            button1.setTitle("Fermata", for: UIControl.State.normal)
            button2.setTitle("Presto", for: UIControl.State.normal)
            button3.setTitle("Staccato", for: UIControl.State.normal)
            button4.setTitle("Mezzo", for: UIControl.State.normal)
            CorrectAnswer = "2"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "Another name for Really Fast?"
            button1.setTitle("Fermata", for: UIControl.State.normal)
            button2.setTitle("Mezzo", for: UIControl.State.normal)
            button3.setTitle("Staccato", for: UIControl.State.normal)
            button4.setTitle("Presto", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else {
            questionLabel.text = "Another name for Really Fast?"
            button1.setTitle("Presto", for: UIControl.State.normal)
            button2.setTitle("Mezzo", for: UIControl.State.normal)
            button3.setTitle("Staccato", for: UIControl.State.normal)
            button4.setTitle("Fermata", for: UIControl.State.normal)
            CorrectAnswer = "1"
        }
    case 6:
        if RandomQuestion == UInt(1) {
            questionLabel.text = "Another way to say From The Beginning?"
            button1.setTitle("Da Capo", for: UIControl.State.normal)
            button2.setTitle("Molto", for: UIControl.State.normal)
            button3.setTitle("Dal Segno", for: UIControl.State.normal)
            button4.setTitle("Al Fine", for: UIControl.State.normal)
            CorrectAnswer = "1"
        } else if RandomQuestion == UInt(2) {
            questionLabel.text = "Another way to say From The Beginning?"
            button1.setTitle("Al Fine", for: UIControl.State.normal)
            button2.setTitle("Da Capo", for: UIControl.State.normal)
            button3.setTitle("Molto", for: UIControl.State.normal)
            button4.setTitle("Dal Segno", for: UIControl.State.normal)
            CorrectAnswer = "2"
        } else if RandomQuestion == UInt(3) {
            questionLabel.text = "Another way to say From The Beginning?"
            button1.setTitle("Molto", for: UIControl.State.normal)
            button2.setTitle("Al Fine", for: UIControl.State.normal)
            button3.setTitle("Dal Segno", for: UIControl.State.normal)
            button4.setTitle("Da Capo", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else {
            questionLabel.text = "Another way to say From The Beginning?"
            button1.setTitle("Al Fine", for: UIControl.State.normal)
            button2.setTitle("Molto", for: UIControl.State.normal)
            button3.setTitle("Da Capo", for: UIControl.State.normal)
            button4.setTitle("Dal Segno", for: UIControl.State.normal)
            CorrectAnswer = "3"
        }
    case 7:
        if RandomQuestion == UInt32(1) {
            questionLabel.text = "In a singing style"
            button1.setTitle("Cantabile", for: UIControl.State.normal)
            button2.setTitle("Diminuendo", for: UIControl.State.normal)
            button3.setTitle("Animato", for: UIControl.State.normal)
            button4.setTitle("Chromatic", for: UIControl.State.normal)
            CorrectAnswer = "1"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "In a singing style"
            button1.setTitle("Chromatic", for: UIControl.State.normal)
            button2.setTitle("Diminuendo", for: UIControl.State.normal)
            button3.setTitle("Animato", for: UIControl.State.normal)
            button4.setTitle("Cantabile", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "In a singing style"
            button1.setTitle("Diminuendo", for: UIControl.State.normal)
            button2.setTitle("Chromatic", for: UIControl.State.normal)
            button3.setTitle("Cantabile", for: UIControl.State.normal)
            button4.setTitle("Animato", for: UIControl.State.normal)
            CorrectAnswer = "3"
        } else {
            questionLabel.text = "In a singing style"
            button1.setTitle("Animato", for: UIControl.State.normal)
            button2.setTitle("Cantabile", for: UIControl.State.normal)
            button3.setTitle("Chromatic", for: UIControl.State.normal)
            button4.setTitle("Diminuendo", for: UIControl.State.normal)
            CorrectAnswer = "2"
        }
    case 8:
        if RandomQuestion == UInt32(1) {
            questionLabel.text = "Which also means From The Sign?"
            button1.setTitle("Dal Segno", for: UIControl.State.normal)
            button2.setTitle("Da Capo", for: UIControl.State.normal)
            button3.setTitle("Grave", for: UIControl.State.normal)
            button4.setTitle("Lento", for: UIControl.State.normal)
            CorrectAnswer = "1"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "Which also means From The Sign?"
            button1.setTitle("Lento", for: UIControl.State.normal)
            button2.setTitle("Dal Segno", for: UIControl.State.normal)
            button3.setTitle("Da Capo", for: UIControl.State.normal)
            button4.setTitle("Grave", for: UIControl.State.normal)
            CorrectAnswer = "2"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "Which also means From The Sign?"
            button1.setTitle("Lento", for: UIControl.State.normal)
            button2.setTitle("Grave", for: UIControl.State.normal)
            button3.setTitle("Da Capo", for: UIControl.State.normal)
            button4.setTitle("Dal Segno", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else {
            questionLabel.text = "Which also means From The Sign?"
            button1.setTitle("Da Capo", for: UIControl.State.normal)
            button2.setTitle("Lento ", for: UIControl.State.normal)
            button3.setTitle("Dal Segno", for: UIControl.State.normal)
            button4.setTitle("Grave", for: UIControl.State.normal)
            CorrectAnswer = "3"
        }
    case 9:
        if RandomQuestion == UInt(1) {
            questionLabel.text = "Which also means The Same As?"
            button1.setTitle("Simile", for: UIControl.State.normal)
            button2.setTitle("Rubato", for: UIControl.State.normal)
            button3.setTitle("Non Troppo", for: UIControl.State.normal)
            button4.setTitle("Mosso", for: UIControl.State.normal)
            CorrectAnswer = "1"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "Which also means The Same As?"
            button1.setTitle("Mosso", for: UIControl.State.normal)
            button2.setTitle("Non Troppo", for: UIControl.State.normal)
            button3.setTitle("Rubato", for: UIControl.State.normal)
            button4.setTitle("Simile", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "Which also means The Same As?"
            button1.setTitle("Rubato", for: UIControl.State.normal)
            button2.setTitle("Simile", for: UIControl.State.normal)
            button3.setTitle("Non Troppo", for: UIControl.State.normal)
            button4.setTitle("Mosso", for: UIControl.State.normal)
            CorrectAnswer = "2"
        } else {
            questionLabel.text = "Which also means The Same As?"
            button1.setTitle("Rubato", for: UIControl.State.normal)
            button2.setTitle("Mosso", for: UIControl.State.normal)
            button3.setTitle("Simile", for: UIControl.State.normal)
            button4.setTitle("Non Troppo", for: UIControl.State.normal)
            CorrectAnswer = "3"
        }
    case 10:
        if RandomQuestion == UInt32(1) {
            questionLabel.text = "Which also means Gradually Get Louder?"
            button1.setTitle("Crescendo", for: UIControl.State.normal)
            button2.setTitle("Decrescendo", for: UIControl.State.normal)
            button3.setTitle("Diminuendo", for: UIControl.State.normal)
            button4.setTitle("Mezzo Forte", for: UIControl.State.normal)
            CorrectAnswer = "1"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "Which also means Gradually Get Louder?"
            button1.setTitle("Diminuendo", for: UIControl.State.normal)
            button2.setTitle("Mezzo Forte", for: UIControl.State.normal)
            button3.setTitle("Crescendo", for: UIControl.State.normal)
            button4.setTitle("Decrescendo", for: UIControl.State.normal)
            CorrectAnswer = "3"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "Which also means Gradually Get Louder?"
            button1.setTitle("Diminuendo", for: UIControl.State.normal)
            button2.setTitle("Crescendo", for: UIControl.State.normal)
            button3.setTitle("Mezzo Forte", for: UIControl.State.normal)
            button4.setTitle("Decrescendo", for: UIControl.State.normal)
            CorrectAnswer = "2"
        } else {
            questionLabel.text = "Which also means Gradually Get Louder?"
            button1.setTitle("Diminuendo", for: UIControl.State.normal)
            button2.setTitle("Decrescendo", for: UIControl.State.normal)
            button3.setTitle("Mezzo Forte", for: UIControl.State.normal)
            button4.setTitle("Crescendo", for: UIControl.State.normal)
            CorrectAnswer = "4"
        }
    case 11:
        if RandomQuestion == UInt32(1) {
            questionLabel.text = "Which also means Gradually Get Softer?"
            button1.setTitle("Diminuendo", for: UIControl.State.normal)
            button2.setTitle("Decrescendo", for: UIControl.State.normal)
            button3.setTitle("Mezzo Forte", for: UIControl.State.normal)
            button4.setTitle("Crescendo", for: UIControl.State.normal)
            CorrectAnswer = "2"
        } else if RandomQuestion == UInt32(2) {
            questionLabel.text = "Which also means Gradually Get Softer?"
            button1.setTitle("Diminuendo", for: UIControl.State.normal)
            button2.setTitle("Mezzo Forte", for: UIControl.State.normal)
            button3.setTitle("Decrescendo", for: UIControl.State.normal)
            button4.setTitle("Crescendo", for: UIControl.State.normal)
            CorrectAnswer = "3"
        } else if RandomQuestion == UInt32(3) {
            questionLabel.text = "Which also means Gradually Get Softer?"
            button1.setTitle("Diminuendo", for: UIControl.State.normal)
            button2.setTitle("Mezzo Forte", for: UIControl.State.normal)
            button3.setTitle("Crescendo", for: UIControl.State.normal)
            button4.setTitle("Decrescendo", for: UIControl.State.normal)
            CorrectAnswer = "4"
        } else {
            questionLabel.text = "Which also means Gradually Get Louder?"
            button1.setTitle("Decrescendo", for: UIControl.State.normal)
            button2.setTitle("Crescendo", for: UIControl.State.normal)
            button3.setTitle("Diminuendo", for: UIControl.State.normal)
            button4.setTitle("Mezzo Forte", for: UIControl.State.normal)
            CorrectAnswer = "1"
        }
    default:

        break
    }
}

1 Ответ

0 голосов
/ 01 января 2019

Прежде всего arc4random() устарел в Swift 4.2 +.

Существуют random(in методы класса для всех числовых типов и shuffled() и randomElement() для получения случайных элементов из массива.

Чтобы получить уникальный случайный элемент из массива, вы можете использовать простую функцию, которая выбирает случайный элемент, а затем удаляет этот элемент из массива.

Если у вас есть 10 вопросов

let numberOfQuestions = 10

создать индексный массив

var indexArray = [Int](0..<numberOfQuestions)

и использовать эту функцию

func uniqueRandomElement(from array: inout [Int]) -> Int? {
    guard let random = array.randomElement() else { return nil }
    let index = array.firstIndex(of: random)!
    array.remove(at: index)
    return random
}

let index = uniqueRandomElement(from: &indexArray)

Возвращает случайный индекс или nil, если были заданы все вопросы.


Код может быть значительно сокращен, если вы организуете вопросы в структуре

struct Question {
    let question : String
    let answers : [String]
    let correctAnswer : String
}

let questions = [Question(question: "What is the tail end of a piece of music?", answers: ["Coda", "Da Capo", "Forte", "Largo"], correctAnswer: "Coda"),
                 ...
                 ...
                 Question(question: "Which also means Gradually Get Softer?", answers: ["Ritardando", "Decrescendo", "Mezzo Forte", "Crescendo"], correctAnswer: "Decrescendo")]

Объявите пустой массив для индексов

var indexArray = [Int]()

и функцию для сбросамассив, заполнив его все индексы вопросов

func resetQuestions() {
    indexArray = [Int](0..<questions.count)
}

randomQuestion получает новый индекс с помощью функции uniqueRandomElement, перетасовывает массив answers и присваивает значениякнопок.Возвращает текущий вопрос

func randomQuestion() -> Question? {
    guard let questionIndex = uniqueRandomElement(from: &indexArray) else {
        Next.isHidden = true
        return nil
    }

    let currentQuestion = questions[questionIndex]
    let shuffledAnswers = currentQuestion.answers.shuffled()
    button1.setTitle(shuffledAnswers[0], for: .normal)
    button2.setTitle(shuffledAnswers[1], for: .normal)
    button3.setTitle(shuffledAnswers[2], for: .normal)
    button4.setTitle(shuffledAnswers[3], for: .normal)
    return currentQuestion
}

Теперь сравните название нажатой кнопки с currentQuestion.correctAnswer.

Примечание: поскольку Decrescendo и Diminuendo на самом деле являются синонимами, лучше использовать что-нибудькак Ritardando в Постепенно смягчайтесь вопрос ?

...