无限抽题功能的实现思路

2021-04-29 15:22:07 +08:00
 dream4ever

要实现的这个功能类似于学习强国里面的那个“挑战答题”,,具体需求如下:

  1. 只要用户答错一道题,本轮答题就立即结束。
  2. 如果答对,就能继续做下一道题,直到答完题库里的所有题。
  3. 在每一轮答题的过程中,同一道题最多只能让用户答一次。

前两个需求我觉得挺简单,主要是最后一个,怎么能够给用户随机抽题,并且每次抽到题目都不重复呢?

我想到的一种比较“笨”的办法,就是每次给用户下发 100 道题的编号,然后从这 100 道题里随机抽取编号,根据编号给用户发送题目。这 100 道题抽完之后,再给用户下发接下来的 100 道题,这样是不是既保证了随机性,也不会给后端太大的压力?

另外还有什么更更好的方法能实现这个需求么?欢迎指点,谢谢先。

786 次点击
所在节点    问与答
6 条回复
kop1989
2021-04-29 15:26:35 +08:00
为何不每次客户端发起答题的时候,在客户端生成一个随机的答题号码串呢?
dream4ever
2021-04-29 15:30:29 +08:00
@kop1989 答题号码串用来记录已答题目信息?
kop1989
2021-04-29 15:35:09 +08:00
@dream4ever #2 你的需求是只要每轮中的题目不重复就 ok 了是吧。

所以你可以在客户端知道“总题目数”的前提下每轮开始前(或者上轮结束后)都随机一个串。
比如第一轮:[1,3,5,7,8,9]
第二轮:[3,1,2,4,6,7]
然后客户端按照这个串,去取题目就好了。
dream4ever
2021-04-29 15:40:41 +08:00
@kop1989 哦对,我刚才想的是你这种思路,不知道为什么写出来成了另一种思路了,好晕,哈哈。
7075
2021-04-29 15:51:35 +08:00
问题有一些重要细节没有描述清楚。比如一共答几轮?每轮之间的具体限制条件是哪些?答错了题目全部重来?
以目前的描述来看:
要求一个用户,不限定轮数一辈子永远抽不到同一道题,那是不可能得,除非题库无限大。
如果要一个用户,每个单独一轮里面,没有重复的题目,这个问题相当简单,方法也很多。最直观的,用题号所谓索引排重(散列到桶,set/map 等)即可
dream4ever
2021-04-30 15:39:16 +08:00
@7075 用户可以答任意轮数,在每一轮内,题库里的所有题目,用户最多只能答一遍,答错了一道题就本轮结束,开始新一轮的随机答题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/774115

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX