在iOS中随机显示字符串而不重复它们

在iOS中随机显示字符串而不重复它们,第1张

概述我正在做一个测验应用程序.该应用程序使用.json文件作为问题和答案的“数据库”.这个.json文件如下所示…… { "id" : "1", "question": "Earth is a:", "answers": [ "Planet", "Meteor", "Sta 我正在做一个测验应用程序.该应用程序使用.Json文件作为问题和答案的“@R_419_6948@”.这个.Json文件如下所示……

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

…而且只是继续讨论500多个问题.

我使用以下代码随机显示问题:

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

这项工作很好,但因为它随机选择问题我发现问题经常重复(即使我有500多个问题!).

我对此进行了广泛的研究,并认为我读得太多,因为我现在很困惑.我读过有关’播种’的内容,关于保存所提问题的索引,以及尝试使用NSUserDefault.

简而言之,我如何修改我的代码以实现以下结果之一:

>不要重复任何问题,但要在问过所有问题时停止提问;
>类似于上面的1,但是用户设置了问题的数量而不是询问@R_419_6948@中的所有问题;
>在首先询问所有问题之前,不要重复任何问题;要么,
>不重复之前已正确回答的任何问题,但可能会重复那些回答错误的问题.

以下是我认为相关的代码:

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)}
解决方法 如果我正确理解您的要求:

>您希望在VIEw Controller实例和应用程序启动之间保留随机生成的数字
>你永远不想重复任何问题

实现此目的的一种快速方法是使用NSUserDefaults跟踪PRNG中(伪)随机数的顺序和值.通过这种方式,您可以通过重放以前的骰子滚动来实例化关于即时的可用问题数组,并按照正确的顺序从池中删除这些问题.

这也让你可以将PRNG作为一个黑盒子来处理,而不是关心播种和重播.

此外,请务必从当前池中删除任何骰子掷骰子中的所选问题.

附注:您没有遵循命名约定 – 例如,函数将以小写字母开头.

为了您自己的良好和可读性,请遵循流行的约定,至少在与他人共享您的代码时.更好的是,所有的时间.

编辑:

更加冗长:

> NSUserDefaults可以轻松地为您保存少量数据.如果你只是想记住一系列数字,那么它就是最好的选择.
>假设您的数据在实例变量中是helt,如下所示:

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

您可以轻松删除PSNG(伪随机数生成器)选择的问题,如下所示:

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

因此,下一个骰子滚动(例如,您的PSNG的调用)保证不会选择已经问过的问题,因为它不再是从它选择的可用问题池中.
>这种方法确实需要您以正确的顺序保存所有随机数,以“重放”实例化新实例之前发生的事情(例如,因为应用程序已重新打开).这就是NSUserDefaultssetObject:forKey:objectForKey:在最初加载问题并“记住”每个新骰子时发挥作用的地方.

我希望,这涵盖了你以前可能不理解的内容.

总结

以上是内存溢出为你收集整理的在iOS中随机显示字符串而不重复它们全部内容,希望文章能够帮你解决在iOS中随机显示字符串而不重复它们所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1048427.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存