试题组卷有没有啥好的算法?
比方说一个试卷,总共60题,每道题都由难度、章节、类型3个属性
按照难度 简单20题 一般30题 困难10题
按照章节 章节一 10题 章节二15题 章节3 20题,章节四15题
按照类型 文字题20题 图片题20题 视频题20题
每种维度题目数量是可以自行设置的,保证总题量等于60就行
不是每个最细分类(我这里称sku把)都有题目或者说有足量的题目,这种情况要考虑到
然后随机从数据库中取出这些题,有没有比较好的算法?
——————-分割线———————
一开始考虑的太理想,想保证每种题型选到的概率统一,且每个题目选到的概率统一,这样考虑就只能暴力算法列举出所有情况,再随机了,然而即使是这种3x3暴力算法,全部可能就有C(60,20)xC(40,10)xC(60,10)xC(50,15)xC(60,20)xC(40,20),(随便算一个数都有10^10+,总共6个数乘起来,想想就恐怖),然后这个里面还有很多重复的情况需要去重,估计给定现在最强的计算器都要算不了
那么现在只能考虑去掉每个题目选到的概率统一这个条件了,参考楼下的一些回复,可以想到的是分成3块,每种给定60个这种类型的题目进行随机,最后计算出来的组合,判断数据库是否存在足够的题目,否则就再进行随机,直到得到题目,这种算法在题目种类,每种充足且很多的时,很好用,但是很明显现实情况不可能会这么完美,缺题情况还是特别多的,比方说,一本书前面几章一般都没啥困难的题,全是理论的章节,肯定也不可能有视频题。这种情况下真正能组合起来的只占全部组合的很小一部分,这样就会出现随机很长很长时间才会命中一个的情况。
所以只能抛弃掉所有理想条件,回到先保证题目能组上这个出发点了,即把所有sku类型及其数目,全部列出,每次随机一种题目,算到60题,然后再比较所有属性和题目中给定的是否符合,如果不符合,就再进行循环,这种方法可以很大程度上提升命中概率(当然可能会存在一些极端情况导致组不了题),但是相对而言,每个题目选到的概率就不是很均匀,一些能保证组上卷的”关键题”,会经常出现在组的每套试卷里。
目前为了保证组题效率,只能考虑在第三种方案上改进(当然如果各位有更好的方案,还请不吝赐教),我能想到的是,每次随机完题目后,计算一下各种类型的组题进度,然后下一次再选题的时候,只选择当前组题进度最慢的那一些类题目进行随机,以增强当前组题的命中率,有点动态规划的意味,不知道各位还有啥高见?
推荐文章: