在洗牌时追踪物品的最佳方式,以及他们在洗牌之前的位置

时间:2013-11-21 01:15:38

标签: performance algorithm language-agnostic

我有一份问题清单。每个问题至少有2个答案可供选择。目前只有一个选项是正确的。

以相同的顺序获得答案会向学生传授答案所在的位置,而不是学习问题的实际答案。亨赫洗牌的答案很好。

问题:我使用索引来跟踪每个问题的正确答案。这种方式不会随意改变答案。

目前的问题结构:

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#编写的,但它并不重要。

3 个答案:

答案 0 :(得分:1)

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

例如

// Given two elements i, and j which will be used to swap, update answer index
if answerIndex = i then
    answerIndex <- j
else if answerIndex = j then
    answerIndex <- i
end

答案 1 :(得分:1)

好吧,如果是我,我会用int ID识别每个答案,然后通过ID识别正确的答案(像int Correct_ID那样。所以,当用户选择一个问题时你所要做的就是比较Correct_ID和所选问题的ID,无论你洗牌多少次。

它与布尔概念类似,但打开了其他可能性:如果您对答案执行其他操作,此ID也可以派上用场,因为比intstring更快。的。 (如果我记得一个情况作为一个例子,我会更新,目前还不能提出一个)

答案 2 :(得分:0)

嗯,这是一个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)。