Performance 洗牌时跟踪物品的最佳方法,洗牌前跟踪物品的位置

Performance 洗牌时跟踪物品的最佳方法,洗牌前跟踪物品的位置,performance,algorithm,language-agnostic,Performance,Algorithm,Language Agnostic,我有一系列问题。每个问题至少有两个答案可供选择。目前只有一种选择是正确的 让答案按相同的顺序排列,可以教会学生答案的位置,而不是学习问题的实际答案。汉奇洗牌回答是好的 问题:我使用索引跟踪每个问题的正确答案。这种方法不适用于将答案混合 当前问题结构: question structure { correct answer, index of where the correct answer is in the array below list of answers, simple arr

我有一系列问题。每个问题至少有两个答案可供选择。目前只有一种选择是正确的

让答案按相同的顺序排列,可以教会学生答案的位置,而不是学习问题的实际答案。汉奇洗牌回答是好的

问题:我使用索引跟踪每个问题的正确答案。这种方法不适用于将答案混合

当前问题结构:

question structure {
  correct answer, index of where the correct answer is in the array below
  list of answers, simple array of strings
}
当在数组中移动正确答案时(Fisher–Yates shuffle),索引会发生变化

一种可能的解决方案是将结构切换到该模式,但效率低下:

question structure {
  list of answers
}

answer structure {
  boolean correct answer (true, false)
  string answer
}
有更好的方法吗? 如何在数组中跟踪正确答案

我在考虑将一系列答案保存在一个列表中,然后使用一个地图并洗牌该地图。看起来像是杀伤力过大、复杂、内存和cpu不足。这样我就可以保持索引的正确答案

我对这个问题视而不见


注意:这个程序原型是用C#编写的,但应该没那么重要。

在洗牌过程中,算法选择两个索引并在这些索引处交换数组元素。您所需要做的就是检查当前答案索引是否是这些索引之一。如果是,请将其更改为另一个

乙二醇

//给定两个元素i和j,它们将用于交换、更新应答索引
如果answerIndex=i,则

answerIndex好吧,如果是我,我会用一个
int ID
来识别每个答案,然后用ID来识别正确的答案(比如
int correct\u ID
。因此,当用户选择一个问题时,你所要做的就是比较正确的ID和所选问题的ID,不管你洗牌多少次

它与布尔思想类似,但也开启了其他可能性:如果您对答案执行其他操作,此ID也可以派上用场,因为比较
int
string
更快。
(如果我记得有一种情况可以作为示例,我会更新,现在还不能想出一个)

好吧,这里有一个Python示例

>>> items = [
...     (0, 'Apple'),
...     (1, 'Banana'),
...     (2, 'Orange'),
...     (3, 'Pear'),
... ]
>>> import random
>>> random.shuffle(items)
>>> items
[(1, 'Banana'), (2, 'Orange'), (0, 'Apple'), (3, 'Pear')]
>>> for key, value in items:
...     print key, value
... 
1 Banana
2 Orange
0 Apple
3 Pear
>>> 
关键的一点是您可以洗牌记录,其中每个记录都有一个与其关联的ID,而不仅仅是字符串值

您可以为每个项目存储唯一的ID,或者只将其中一个标记为“正确”答案(因此每个项目都有一个True或False,并且只有一个是True)

>>> items = [
...     (0, 'Apple'),
...     (1, 'Banana'),
...     (2, 'Orange'),
...     (3, 'Pear'),
... ]
>>> import random
>>> random.shuffle(items)
>>> items
[(1, 'Banana'), (2, 'Orange'), (0, 'Apple'), (3, 'Pear')]
>>> for key, value in items:
...     print key, value
... 
1 Banana
2 Orange
0 Apple
3 Pear
>>>