Display strings in iOS randomly without repeating them

I am making a quiz app. The application uses the .json file as a "database" of questions and answers. This .json file is as follows:

      {
        "id" : "1",
        "question": "Earth is a:",
             "answers": [
            "Planet",
            "Meteor",
            "Star",
            "Asteroid"
          ],
          "difficulty": "1"
      }

... and just goes on with over 500 questions.

I display questions randomly using the following code:

    let randomNumber = Int(arc4random_uniform(UInt32(allEntries.count)))
    LoadQuestion(randomNumber)

This work is great, but since it selects questions randomly, I find that the questions are repeated too regularly (although I have more than 500 questions!).

I have researched this extensively and I think that perhaps I read too much, since now I am completely confused. I read about sowing, keeping an index of questions asked, and trying to use NSUserDefault.

In short, how can I change my code to achieve one of the following results:

  • - , , ,
  • , , , ;
  • , ; ,
  • - , , , , .

, :

    LoadAllQuestionsAndAnswers()

    let randomNumber = Int(arc4random_uniform(UInt32(allEntries.count)))
    LoadQuestion(randomNumber)


func LoadAllQuestionsAndAnswers()
{
    let path = NSBundle.mainBundle().pathForResource("content", ofType: "json")
    let jsonData : NSData = NSData(contentsOfFile: path!)!
    allEntries = (try! NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers)) as! NSArray
    //println(allEntries)

}


func LoadQuestion(index : Int)
{
    let entry : NSDictionary = allEntries.objectAtIndex(index) as! NSDictionary
    let question : NSString = entry.objectForKey("question") as! NSString
    let arr : NSMutableArray = entry.objectForKey("answers") as! NSMutableArray

    //println(question)
    //println(arr)

    labelQuestion.text = question as String

    let indices : [Int] = [0,1,2,3]
    //let newSequence = shuffle(indices)
    let newSequence = indices.shuffle()
    var i : Int = 0
    for(i = 0; i < newSequence.count; i++)
    {
        let index = newSequence[i]
        if(index == 0)
        {
            // we need to store the correct answer index
            currentCorrectAnswerIndex =  i

        }

        let answer = arr.objectAtIndex(index) as! NSString
        switch(i)
        {
        case 0:
            buttonA.setTitle(answer as String, forState: UIControlState.Normal)
            break;

        case 1:
            buttonB.setTitle(answer as String, forState: UIControlState.Normal)
            break;

        case 2:
            buttonC.setTitle(answer as String, forState: UIControlState.Normal)
            break;

        case 3:
            buttonD.setTitle(answer as String, forState: UIControlState.Normal)
            break;

        default:
            break;
        }



    }
    buttonNext.hidden = true
    // we will need to reset the buttons to reenable them
    ResetAnswerButtons()

}



@IBAction func PressedButtonNext(sender: UIButton) {
    print("button Next pressed")
    let randomNumber = Int(arc4random_uniform(UInt32(allEntries.count)))
    LoadQuestion(randomNumber)

}
+4
1

:

  • View Controller .
  • - .

- NSUserDefaults, () PRNG. , , , .

PRNG , .

, .

. . , .

, , , , . , .

Edit

:

  • NSUserDefaults . , .
  • , :

    var questions : [Question] = // load the questions - carefully, see below.
    

    , PSNG (p seudo- r om n umber g). :

    let randomNumber = Int(arc4random_uniform(UInt32(questions.count)))
    questions.removeAtIndex(randomNumber)
    

    , (, PSNG) , , , .

  • , , "" , , (, ). NSUserDefaults 'setObject:forKey: objectForKey: "" .

, , , , .

+3

Source: https://habr.com/ru/post/1625816/


All Articles