

プログラミングを始めて1ヶ月ほどの入門者です。  
Swift 4で、クイズアプリを作成中です。  
クイズアプリの問題を重複せずにランダムに出題させたいのですが、同じ問題が繰り返されてしまい、うまくいきません。  
問題を重複せずにランダムに出題させる方法を教えていただける方がおられましたらご教授願います。

LabelQuestionに問題、Button1〜Button3に問題の答えを用意し、選択した答えが正解かどうかをLabelCommentに表示させ、ButtonNextQuestionを押して次の問題と答えを表示させるというものです。

コードは以下のとおりです。

[code]

    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var LabelQuestion: UILabel!
        @IBOutlet weak var Button1: UIButton!
        @IBOutlet weak var Button2: UIButton!
        @IBOutlet weak var Button3: UIButton!
        @IBOutlet weak var LabelComment: UILabel!
        @IBOutlet weak var ButtonNextQuestion: UIButton!
        var correctAnswer = String()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            randomQestions()
            hide()
            ButtonNextQuestion.setTitle("NEXT QUESTION", for: UIControlState.normal)
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    
        func randomQestions(){
    
            var question = ["case 1", "case 2", "case 3", "case 4"]
            var result:[String] = []
    
            for _ in 0...3 {
                let randomNumber = Int(arc4random() % UInt32(question.count))
    
                result.append(question[randomNumber])
                question.remove(at: (randomNumber))
    
                switch (randomNumber) {
                case 1:
                    LabelQuestion.text = "1+1=?"
                    Button1.setTitle("1", for: UIControlState.normal)
                    Button2.setTitle("2", for: UIControlState.normal)
                    Button3.setTitle("3", for: UIControlState.normal)
                    correctAnswer = "1"
                    break
                case 2:
                    LabelQuestion.text = "3+3=?"
                    Button1.setTitle("4", for: UIControlState.normal)
                    Button2.setTitle("5", for: UIControlState.normal)
                    Button3.setTitle("6", for: UIControlState.normal)
                    correctAnswer = "3"
                    break
                case 3:
                    LabelQuestion.text = "4+4=?"
                    Button1.setTitle("7", for: UIControlState.normal)
                    Button2.setTitle("8", for: UIControlState.normal)
                    Button3.setTitle("9", for: UIControlState.normal)
                    correctAnswer = "2"
                    break
                case 4:
                    LabelQuestion.text = "6+6=?"
                    Button1.setTitle("10", for: UIControlState.normal)
                    Button2.setTitle("11", for: UIControlState.normal)
                    Button3.setTitle("12", for: UIControlState.normal)
                    correctAnswer = "3"
                    break
                default:
                    break
                }
            }
        }
    
        func hide() {
            LabelComment.isHidden = true
        }
        func unhide() {
            LabelComment.isHidden = false
        }
    
        @IBAction func Button1Action(_ sender: Any) {
            unhide()
            if (correctAnswer == "1") {
                LabelComment.text = "◯"
            } else {
                LabelComment.text = "×"
            }
        }
        @IBAction func Button2Action(_ sender: Any) {
            unhide()
            if (correctAnswer == "2") {
                LabelComment.text = "◯"
            } else {
                LabelComment.text = "×"
            }
        }
        @IBAction func Button3Action(_ sender: Any) {
            unhide()
            if (correctAnswer == "3") {
                LabelComment.text = "◯"
            } else {
                LabelComment.text = "×"
            }
        }
    
        @IBAction func ButtonNextQuestion(_ sender: Any) {
            randomQestions()
            hide()
        }
    }
    
[/code]

宜しくお願いいたします。

* * *

<追記>  
ご回答ありがとうございます。

教えていただいた  
swiftでArrayを擬似乱数でshuffleする方法は？  
を参考に書き換えてみたと言いますか、そのまま使用してみたところ３つエラーが出てしまいました。  
エラーを解決しようと、countを消したり、0..<(count - 1)の数値を変えてみたりしたのですが、うまくいきません。

「var question = ["case 1", "case 2", "case 3", "case 4"]」から「switch
(randomNumber) {」の間を書き換えたのが下記です。

[code]

        var question = ["case 1", "case 2", "case 3", "case 4"]
    
        extension Array {
            mutating func shuffle() {
                for i in 0..<(count - 1) {
                    let j = Int(arc4random_uniform(UInt32(count - i))) + i
                    swap(&self[i], &self[j])
                }
            }
    
            switch (randomNumber) {
    
[/code]

extension Array { のところに「Declaration is only valid at file scope」  
for i in 0..<(count - 1) { のところに「Use of unresolved identifier 'count'」  
switch (randomNumber) { のところに「Expected declaration」  
という３つのエラーメッセージが出てしまいます。

エラーを消してシャッフルさせるには、どのようにコードを書き換えればよいでしょうか。

ご教授いただけたら幸いです。  
宜しくお願いいたします。


CC BY-SA 3.0
2017-12-11T04:21:46.987
40181
2017-12-12T06:43:58.120
2017-12-12T06:43:58.120
question
swift
問題を重複せずにランダムに出題させたい


乱数は原理的に同じ数値が出るもの、違う数値しか出ないのであれば乱数とは呼べないので、ここは発想を逆にしてみましょう。

問題一覧があるとき、それの順番をあらかじめシャッフルしておいて、順番に使う。  
[swiftでArrayを擬似乱数でshuffleする方法は？](https://ja.stackoverflow.com/questions/9110/)  
問題一覧のうち適当な問題を乱数で選び、それを捨てる、を繰り返す。  
[swift クイズアプリの問題をシャッフル出題させるには](https://ja.stackoverflow.com/questions/38614/)


CC BY-SA 3.0
2017-12-11T07:34:53.467
40184
2017-12-11T07:34:53.467
8589
40181
answer