在线考试系统之随机抽取试题

这几天做了一个在线考试系统,下面是数据表。

大概思路:就是根据学生选择的老师和科目  ——  得到那个老师对于这个科目的题型设置 ——然后根据题型设置取到对应科目的题集——再随机选出老师设置对应题目类型的个数的题——把随机选出的题显示给学生答题——因为涉及到一个学生只有一次考试资格,所以设置了学生第一次取到题后刷新不能继续随机抽取试题,所以需要把第一次抽取出来的试题显示出来。 



遇到了点问题,下面是自己的解决办法

1.关于随机抽取试题,抽出的试题需要包括本科目的所有章节。我想到了三个解决办法,但是采取的是最后一种方法。这算得上一个思考过程吧!

第一种方法:

①获取到老师对科目设置的题目类型,每个题目类型的个数count

②然后计算此科目的章节数n,获取章节Id

③然后根据count/n 得到每个章节平均需要取出的题目个数,count%n 得到余下的题目数

④遍历章节id, 通过章节id得到这个章节的总题集,然后设置随机数的范围为总题集数之类,然后通过随机数获取问题,装进集合。这里又涉及到随机数重复问题,所以需要设置问题的equals 方法,如果包含就重新获取随机数,知道本集合的题目数目达到老师设置的题目数目

第二种方法:

①获取到老师对科目设置的题目类型,每个题目类型的个数count

②然后计算此科目的章节数n,获取章节Id

③根据章节id获取章节中包含题目数的最小的那个题目数目min,和全部题目all

④抽取一个随机数为begin 作为起始数,然后抽取一个随机数random(设置其范围为 min/2 <= random <= min)

⑤每次抽取begin + random,依次递增,当达到了全部题目的size,就重最开始抽取


第三种方法:

①把全部题目抽取出来,按照章节id排序,得到总共数目allCount

②获取到老师对科目设置的题目类型,每个题目类型的个数count

③设置随机数begin (范围可设置为10、20;如果设置为10,老师设置的卷子板块为3的话,理论上就会有10的3次方那么多套不一样的题)

④设置每次递增数next 为(allCount - begin)/ count ,有效防止了超出了题目的总数目个数

⑤通过begin+ next 抽取出题目,放入集合中

本方法的优点:①一般地取出的题包含了全部章节,只要每个章节拥有的题目数目差别不大。

    ②就算差别很大,结果也会是:章节拥有的题目数目越多抽取出来的概率越大,也就是符合现实的,一般重要章节拥有的题目数才会越大


这是解决随机抽取试题的方法,这里抽取分类为章节,如果是其他条件,也可以用这种方法


2.关于随机抽取出的试题是通过学生选择的老师和科目生成的,所以如果学生在考试页面刷新了,则后台就无法获取选择的老师和科目,进而不能生成题目;就算获取的老师和科目,则给了学生选择试题的机会,因为每刷新一次就会随机抽取一次。

解决办法:

如果第一次抽取试题,则随机抽取;如果不是第一次,则从数据库中把试题取出。因为抽取出的考试试题是按顺序放入数据库中,所以重新抽取出来也要按照放进去的顺序抽取出来

  • 7
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值