{ "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的调用)保证不会选择已经问过的问题,因为它不再是从它选择的可用问题池中.
>这种方法确实需要您以正确的顺序保存所有随机数,以“重放”实例化新实例之前发生的事情(例如,因为应用程序已重新打开).这就是NSUserDefaults
‘ setObject:forKey:
和objectForKey:
在最初加载问题并“记住”每个新骰子时发挥作用的地方.
我希望,这涵盖了你以前可能不理解的内容.
总结以上是内存溢出为你收集整理的在iOS中随机显示字符串而不重复它们全部内容,希望文章能够帮你解决在iOS中随机显示字符串而不重复它们所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)