【问题标题】:Best way to keep track of an item when shuffling, of where they were before shuffeling在洗牌时跟踪项目的最佳方式,在洗牌之前它们在哪里
【发布时间】:2013-11-21 01:15:37
【问题描述】:

我有一个问题清单。每个问题至少有 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# 编写的,但应该没那么重要。

【问题讨论】:

    标签: performance algorithm language-agnostic


    【解决方案1】:

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

    例如

    // 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
    

    【讨论】:

      【解决方案2】:

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

      它类似于布尔的想法,但提供了其他可能性:如果您对答案执行其他操作,此 ID 也可以派上用场,因为比较 int 的速度比比较 string 的速度快。 (如果我记得有一个情况可以作为例子,我会更新,暂时想不出)

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2014-09-03
          • 1970-01-01
          • 2010-09-08
          • 1970-01-01
          • 2023-03-07
          • 2021-06-14
          • 1970-01-01
          • 2012-05-09
          • 1970-01-01
          相关资源
          最近更新 更多