混洗回收数据的算法
Algorithm for shuffling recycled data
我有一个向用户提问的程序。如果用户不知道答案,他可以跳过它。
但如果他回答错误,则该问题将被扣分,然后必须在测验期间随时随机再次提出该问题。
如果问题回答正确,则无需再次提问。
有没有什么算法可以把这样的问题打乱?
解决此问题的一种方法是将问题存储在 priority queue 中。最初 n
问题的优先级从 1 到 n
。随后,当你想回收一个问题时,你可以为它分配一个从 x
到 n + 1
中随机选择的新优先级,其中 x
是已从优先级中删除的问题数队列。现在您重新插入问题并照常进行。
如果用堆实现优先级队列,在处理同等优先级的元素时将面临两难境地。通常,只要元素键相等,您就会停止通过堆冒泡元素。在您的情况下,这会对测验产生不利影响,因为优先级相同的元素不会随机均匀排序——它们在堆中的位置将取决于插入顺序。
您可以通过使用双精度浮点值来解决这个问题。现在初始优先级为 1.0、2.0、3.0 等。随后,您从范围 [1.0 * x, n + 1.0]
中选择一个随机浮点值,其中 x
是从优先队列中删除的问题数,而 n
是您要删除的问题数开始于。现在您不会遇到相等键的问题,因为您随机选择现有双精度值之一的可能性几乎为零。机会实际上不是零,但它小于今天流星撞击您的计算机的几率。
我有一个向用户提问的程序。如果用户不知道答案,他可以跳过它。
但如果他回答错误,则该问题将被扣分,然后必须在测验期间随时随机再次提出该问题。
如果问题回答正确,则无需再次提问。
有没有什么算法可以把这样的问题打乱?
解决此问题的一种方法是将问题存储在 priority queue 中。最初 n
问题的优先级从 1 到 n
。随后,当你想回收一个问题时,你可以为它分配一个从 x
到 n + 1
中随机选择的新优先级,其中 x
是已从优先级中删除的问题数队列。现在您重新插入问题并照常进行。
如果用堆实现优先级队列,在处理同等优先级的元素时将面临两难境地。通常,只要元素键相等,您就会停止通过堆冒泡元素。在您的情况下,这会对测验产生不利影响,因为优先级相同的元素不会随机均匀排序——它们在堆中的位置将取决于插入顺序。
您可以通过使用双精度浮点值来解决这个问题。现在初始优先级为 1.0、2.0、3.0 等。随后,您从范围 [1.0 * x, n + 1.0]
中选择一个随机浮点值,其中 x
是从优先队列中删除的问题数,而 n
是您要删除的问题数开始于。现在您不会遇到相等键的问题,因为您随机选择现有双精度值之一的可能性几乎为零。机会实际上不是零,但它小于今天流星撞击您的计算机的几率。