2017-11-10 31 views
1

私が取り組んでいるクイズプロジェクトがありますが、現時点では質問をシャッフルして配列から個々のアイテムを選ぶのは難しいです。以下の私のコードを見つけてください。コントローラを選択質問をシャッフルして配列の1つのアイテムを表示する方法

マイカテゴリーがある:

struct Quiz { 
private(set) var name = String() 
private(set) var plist: NSArray 



init(name: String) { 
self.name = name 
plist = NSArray(contentsOfFile: Bundle.main.path(forResource: name, ofType: "plist")!)! 

} 

static let quizzes = [Quiz(name: "Development"), Quiz(name: "Reflexes")]} 

Plist image is here

を次のように私のクイズコントローラは

override func viewDidLoad() {  
super.viewDidLoad() 


set = shuffledQuiz([[Quiz.quizzes[currentTopicIndex].plist]]) 

quiz = set.objectEnumerator() 


pickQuestion() 
} 

func shuffledQuiz(_ name: [[NSArray]]) -> NSArray{ 
if currentSetIndex < name.count { 
    return name[currentSetIndex].shuffled() as NSArray 
} 
return NSArray()} 

func pickQuestion() { 

if let quiz = quiz?.nextObject() as? NSArray { 
    print(quiz) 

    let questionLabel: [String] = quiz.value(forKeyPath: "question") as! NSArray as! [String] 

    print(questionLabel) 
    self.questionLabel.text = questionLabel.description 

    let correctAnswer: [Int] = quiz.value(forKey: "Answer") as! NSArray as! [Int] 
    print(correctAnswer) 
    let answers = quiz.value(forKeyPath: "options") as! NSArray 

    print(answers) 


    for i in 0..<answersButtons.count { 
     answersButtons[i].setTitle((answers[i] as AnyObject).localizedName, for: .normal) 
    } 
    remainingQuestionsLabel.text = "\(set.index(of: quiz) + 1)/\(set.count)" 
} 
else { 
    endOfQuestionsAlert() 
} 
} 

私のplistのは、私はこの上の任意の助けをいただければ幸いです。ありがとうございました。

答えて

1

シャッフルFisher-Yatesを使用してください。

基本的なアルゴリズムは以下のとおりです。

  1. あなたunshuffled配列で始まり、空のシャッフルの配列。
  2. シャッフルされていない配列から要素をランダムに選択します。
  3. シャッフルされていない配列から削除し、シャッフルされた配列の末尾に追加します。
  4. シャッフルしていない配列が空になるまで、手順2と3を繰り返します。
  5. シャッフルされた配列を返します。

あなたは

  1. は、配列の要素数に変数nを設定し、次のアルゴリズムを使用して、「代わりに」配列をシャッフルすることができます。
  2. nがゼロになるまで要素とスワップエレメントxn - 1
  3. 減算1
  4. nから繰り返し2~4ステップ
  5. arc4random_uniform()を使用)0 ..< n乱数xを選びます。
関連する問題