V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dream4ever
V2EX  ›  问与答

无限抽题功能的实现思路

  •  
  •   dream4ever · 2021-04-29 15:22:07 +08:00 · 662 次点击
    这是一个创建于 1064 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    kop1989
        1
    kop1989  
       2021-04-29 15:26:35 +08:00
    为何不每次客户端发起答题的时候,在客户端生成一个随机的答题号码串呢?
    dream4ever
        2
    dream4ever  
    OP
       2021-04-29 15:30:29 +08:00
    @kop1989 答题号码串用来记录已答题目信息?
    kop1989
        3
    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
        4
    dream4ever  
    OP
       2021-04-29 15:40:41 +08:00
    @kop1989 哦对,我刚才想的是你这种思路,不知道为什么写出来成了另一种思路了,好晕,哈哈。
    7075
        5
    7075  
       2021-04-29 15:51:35 +08:00
    问题有一些重要细节没有描述清楚。比如一共答几轮?每轮之间的具体限制条件是哪些?答错了题目全部重来?
    以目前的描述来看:
    要求一个用户,不限定轮数一辈子永远抽不到同一道题,那是不可能得,除非题库无限大。
    如果要一个用户,每个单独一轮里面,没有重复的题目,这个问题相当简单,方法也很多。最直观的,用题号所谓索引排重(散列到桶,set/map 等)即可
    dream4ever
        6
    dream4ever  
    OP
       2021-04-30 15:39:16 +08:00
    @7075 用户可以答任意轮数,在每一轮内,题库里的所有题目,用户最多只能答一遍,答错了一道题就本轮结束,开始新一轮的随机答题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1519 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:17 · PVG 01:17 · LAX 10:17 · JFK 13:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.