如何打乱问题并显示数组的一项
Posted
技术标签:
【中文标题】如何打乱问题并显示数组的一项【英文标题】:How to shuffle questions and show one item of an array 【发布时间】:2017-11-10 10:47:43 【问题描述】:我正在处理一个测验项目,但是目前我发现很难随机排列问题并从数组中选择单个项目。请在下面找到我的代码。
我选择控制器的类别是:
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")]
我的测验控制器是
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 随机播放。
基本算法是:
-
从您的未洗牌数组和一个空的洗牌数组开始。
从未洗牌的数组中随机选择一个元素
将其从未洗牌数组中移除,并将其添加到已洗牌数组的末尾。
重复第 2 步和第 3 步,直到未洗牌的数组为空。
返回打乱后的数组。
您可以使用以下算法“就地”打乱数组
-
将变量 n 设置为数组中的元素数。
在
0 ..< n
中选择一个随机数x
(使用arc4random_uniform())
将元素x
与元素n - 1
交换
从n
中减去1
重复步骤 2 到 4,直到 n
为零。
【讨论】:
以上是关于如何打乱问题并显示数组的一项的主要内容,如果未能解决你的问题,请参考以下文章