根据随机组卷规则每次随机生成不重复的试题集合

前言:顾名思义,随机组合试卷是区别于固定试卷的,固定试卷里面的题目都是规定好,不会产生变化;而随机组合试卷是事先定义好一套组合的规则,每次根据规则来随机产生不重复的试题组合。

一、背景意义:随机试卷功能的开发有效遏制了考场上作弊的不良风气,也有利于为所有考生提供公平、公正的考试环境,因此随机组卷功能的开发将成为考试界线上考试的一种主流。

二、需求分析:就像前言一样,本人在实际开发过程中开发了固定试卷和随机组卷这两个模块,在随机组卷模块里主要是制定各类型试题组合规则,包括每个类型题目数量多少,每个题目分值多少,还有该随机组合试卷名称和考试限时等等,具体效果图以及该模块表结构对应的实体类如下:

public class TRandomPaper implements Serializable {

    private static final long serialVersionUID=1L;

    /** 随机试卷ID */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
	
	/** 随机试卷名称 */
    @Excel(name = "随机试卷名称")
    private String paperName;
    
    /** 考核类别ID */
    @Excel(name = "考核类别ID")
    private Long subjectId;
    
    /** 单选题数量 */
    @Excel(name = "单选题数量")
    private Long singleNum;
	
    /** 每个单选题分值 */
    @Excel(name = "每个单选题分值")
    private Long perSingleScore;

    /** 多选题数量 */
    @Excel(name = "多选题数量")
    private Long multipleNum;
    
    /** 每个多选题分值 */
    @Excel(name = "每个多选题分值")
    private Long perMultipleScore;
    
    /** 判断题数量 */
    @Excel(name = "判断题数量")
    private Long judgeNum;

    /** 每个判断题分值 */
    @Excel(name = "每个判断题分值")
    private Long perJudgeScore;
    
    /** 简答题数量 */
    @Excel(name = "简答题数量")
    private Long shortNum;
    
    /** 每个简答题的分值 */
    @Excel(name = "每个简答题的分值")
    private Long perShortSocre;
    
    /** 应用题数量 */
    @Excel(name = "应用题数量")
    private Long applyNum;
    
    /** 每个应用题分值 */
    @Excel(name = "每个应用题分值")
    private Long perApplyScore;

    /** 试卷总分 */
    @Excel(name = "试卷总分")
    private Long totalScore;

    /** 考试限时(以分钟为单位) */
    @Excel(name = "考试限时(以分钟为单位)")
    private Long limitTime;

    /** 试卷说明 */
    @Excel(name = "试卷说明")
    private String paperIntroduce;
    
    /** 及格分数线*/
    @Excel(name = "及格分数线")
    private Long passSocre;
    
    /** 考试开始时间 */
    @Excel(name = "考试开始时间" , width = 30, dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date startTime;
    
    /** 考试结束时间 */
    @Excel(name = "考试结束时间" , width = 30, dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endTime;

    /** 试题难度星数 */
    @Excel(name = "试题难度星数")
    private Long difficultStartNum;

    /** 是否删除(false代表未删除) */
    @Excel(name = "是否删除(false代表未删除)")
    private boolean deleted; 
}

三、各类型试题根据规则随机进行不重复组合,代码如下:

/**
* 微信小程序根据规则进行不重复试题随机组卷
* @param qRequest
* @return
*/
@ApiOperation(value = "WX小程序根据规则进行不重复试题随机组卷",notes = "不重复试题随机组卷")
@RequestMapping(value = "/wxRandomQComByRule", method = RequestMethod.POST)
public Response<List<Question>> wxRandomQComByRule(@RequestBody Questionparam qRequest) {
     
	 //questionDetail.getList()可获取该考核类型下所有的试题集合
	 //获取questionDetail的相关方法代码此处省略,直接从此处开始
	 List<Question> qList = questionDetail.getList();
	 
	 //根据考核类型subjectId查询该类别随机组卷规则详情
	 QueryWrapper<TRandomPaper> randomWrapper = new QueryWrapper<TRandomPaper>();
	 //qRequest.getSubjectId()可获取考核模块subjectId
	 randomWrapper.lambda().eq(TRandomPaper::getSubjectId, qRequest.getSubjectId());
	 TRandomPaper tRandomPaper = iTRandomPaperService.getOne(randomWrapper);
	 
	 //预定义各种类型的题目的集合
	 List<Question> qSingelList = new ArrayList<Question>();
	 List<Question> qMultipleList = new ArrayList<Question>();
	 List<Question> qJudgeList = new ArrayList<Question>();
	 List<Question> qShortList = new ArrayList<Question>();
	 List<Question> qApplylList = new ArrayList<Question>();
	 //遍历该考核模块下先前拿到的试题总集合
	 for(Question Question : qList) {
	     //由于QuestionType是数值类型,此处转成字符串,要不然switch/case 用不了
		 switch (Question.getQuestionType().toString()) {
		    //1代表单选题
			case "1":
				qSingelList.add(Question);
				break;
		    //2代表多选题
			case "2":
				qMultipleList.add(Question);
				break;
			//3代表判断题
			case "3":
				qJudgeList.add(Question);
				break;
			//5代表简答题
			case "5":
				qShortList.add(Question);
				break;
			//6代表应用题
			case "6":
				qApplylList.add(Question);
				break;
			default:
				break;
		}
	 }
	 //预定义各类型试题随机结果集合
	 List<Question> singeRQList = null;
	 List<Question> multiRQList = null;
	 List<Question> judgeRQList = null;
	 List<Question> shortRQList = null;
	 List<Question> applyRQList = null;
	 //单选题:如题库题数小于等于需要的题数,即返回现有的题目集合
	 if(qSingelList.size() <= tRandomPaper.getSingleNum().intValue()) {
		 singeRQList = qSingelList;
	 }else {
	     //此处随机拿到该类型的试题的HashSet<Question>格式,需转成ArrayList<Question>,才能用singeRQList接收
		 singeRQList = new ArrayList<Question>(this.getQTypeHashSet(qSingelList, tRandomPaper.getSingleNum().intValue()));
	 }
	 //多选题:如题库题数小于等于需要的题数,即返回现有的题目集合
	 if(qMultipleList.size() <= tRandomPaper.getMultipleNum().intValue()) {
		 multiRQList = qSingelList;
	 }else {
	     //此处随机拿到该类型的试题的HashSet<Question>格式,需转成ArrayList<Question>,才能用multiRQList接收
		 multiRQList = new ArrayList<Question>(this.getQTypeHashSet(qMultipleList, tRandomPaper.getMultipleNum().intValue()));
	 }
	 //判断题:如题库题数小于等于需要的题数,即返回现有的题目集合
	 if(qJudgeList.size() <= tRandomPaper.getJudgeNum().intValue()) {
		 judgeRQList = qJudgeList;
	 }else {
	     //此处随机拿到该类型的试题的HashSet<Question>格式,需转成ArrayList<Question>,才能用judgeRQList接收
		 judgeRQList = new ArrayList<Question>(this.getQTypeHashSet(qJudgeList, tRandomPaper.getJudgeNum().intValue()));
	 }
	 //简答题:如题库题数小于等于需要的题数,即返回现有的题目集合
	 if(qShortList.size() <= tRandomPaper.getShortNum().intValue()) {
		 shortRQList = qShortList;
	 }else {
	     //此处随机拿到该类型的试题的HashSet<Question>格式,需转成ArrayList<Question>,才能用shortRQList接收
		 shortRQList = new ArrayList<Question>(this.getQTypeHashSet(qShortList, tRandomPaper.getShortNum().intValue()));
	 }
	 //应用题:如题库题数小于等于需要的题数,即返回现有的题目集合
	 if(qApplylList.size() <= tRandomPaper.getApplyNum().intValue()) {
		 applyRQList = qApplylList;
	 }else {
	     //此处随机拿到该类型的试题的HashSet<Question>格式,需转成ArrayList<Question>,才能用applyRQList接收
		 applyRQList = new ArrayList<Question>(this.getQTypeHashSet(qApplylList, tRandomPaper.getApplyNum().intValue()));
	 }
	 //调用合并各类型随机试题集合的方法
	 List<Question> finalList = this.mergeQList(singeRQList, multiRQList, judgeRQList, shortRQList, applyRQList);
	 questionDetail.setList(finalList);
	 return Response.ok(questionDetail);
}

/**
 * 根据不同类型的试题集合和规则中该类型题目制定的数量返回随机不重复的HashSet集合
 * @param qList qMumber
 * @return
 */
public Set<Question> getQTypeHashSet(List<Question> qList, int qMumber){
	Set<Question>  questionSet = new HashSet<>();
	while (numSet.size() < qMumber) {
		int index = (int) (Math.floor(Math.random() * qList.size()));
		if(!questionSet.contains(qList.get(index))) {
			questionSet.add(qList.get(index));
		}
	}
	//此处打印随机生成的结构
	for(Question Question : questionSet){
          System.out.println("试题类型:"+Question.getQuestionType()+"// 试题Id:"+Question.getId());
	}
	System.out.println("--------------------------------------");
	return questionSet;
}

/**
 * 把随机生成各种类型试题进行合并
 * @param singeRQList multiRQList judgeRQList shortRQList applyRQList
 * @return
 */
public List<Question> mergeQList(List<Question> singeRQList, List<Question> multiRQList, List<Question> judgeRQList, List<Question> shortRQList, List<Question> applyRQList ){
	List<Question> mergeList = new ArrayList<Question>();
	mergeList.addAll(singeRQList);
	mergeList.addAll(multiRQList);
	mergeList.addAll(judgeRQList);
	mergeList.addAll(shortRQList);
	mergeList.addAll(applyRQList);
	return mergeList;
}

四、根据规则各类型试题随机不重复组合效果图如下:

五、谢谢您的浏览,希望能帮到您或者稍微的启发到您!

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Qt提供的QRandomGenerator类来生成随机数,并使用QSet类来存储生成随机数,确保不会产生重复随机数。以下是一个示例代码: ```c++ #include <QSet> #include <QRandomGenerator> QSet<int> generateRandomNumbers(int count, int minValue, int maxValue) { QSet<int> randomNumbers; QRandomGenerator randomGenerator; randomGenerator.seed(QDateTime::currentMSecsSinceEpoch()); // 设置随机生成器的种子为当前时间 while (randomNumbers.count() < count) { int randomNumber = randomGenerator.bounded(minValue, maxValue + 1); // 生成[minValue, maxValue]范围内的随机整数 randomNumbers.insert(randomNumber); // 将随机数插入到集合中 } return randomNumbers; } ``` 使用示例: ```c++ QSet<int> randomNumbers = generateRandomNumbers(5, 1, 10); foreach(int number, randomNumbers) { qDebug() << number; } ``` 该函数将生成5个范围在1到10之间的不重复随机整数,并将其存储在QSet中返回。 ### 回答2: 在Qt中,可以使用QRandomGenerator类来生成随机数。要生成一组指定范围内的不重复随机数,可以借助QSet容器来实现。 首先,创建一个QSet对象,用于存储已生成随机数。然后,使用QRandomGenerator::global()->bounded()函数来生成一个随机数,并将其添加到QSet中。如果生成随机数已经存在于QSet中,则重新生成一个。重复这个步骤,直到生成指定数量的不重复随机数为止。 以下是一个示例代码: ```cpp #include <QRandomGenerator> #include <QSet> QSet<int> generateUniqueRandomNumbers(int min, int max, int count) { QSet<int> randomNumbers; while (randomNumbers.size() < count) { int randomNumber = QRandomGenerator::global()->bounded(min, max + 1); randomNumbers.insert(randomNumber); } return randomNumbers; } int main() { int min = 1; // 指定范围的最小值 int max = 100; // 指定范围的最大值 int count = 10; // 需要生成随机数数量 QSet<int> randomNumbers = generateUniqueRandomNumbers(min, max, count); for (int randomNumber : randomNumbers) { qDebug() << randomNumber; } return 0; } ``` 上述代码中,generateUniqueRandomNumbers()函数接受三个参数:指定范围的最小值、最大值和需要生成随机数数量。函数内部使用while循环不断生成随机数,并将其添加到QSet中,直到QSet的大小达到指定数量为止。最后,将生成随机数依次打印出来。 注意,需要在项目文件中添加QT += core以包含QtCore模块的头文件,并在代码中包含相关的头文件。此外,示例代码中使用了QDebug来输出随机数,因此还需添加QT += debug。 以上就是在Qt中随机产生一组指定范围内的不重复随机数的方法。 ### 回答3: 在Qt中,可以使用QRandomGenerator类来生成随机数。要生成一组指定范围内的不重复随机数,可以采用以下步骤: 1. 引入QRandomGenerator类:首先在代码中引入QRandomGenerator类,可以通过#include <QRandomGenerator>来实现。 2. 设置种子:使用QRandomGenerator类的global()静态成员函数来获取全局的QRandomGenerator对象。可以使用其seed()函数设置种子值,以保证每次运行生成随机数序列是不同的。 3. 生成随机数序列:可以使用QList或QSet容器来存储生成随机数。首先创建一个空的QList或QSet对象,用于存储随机数。然后使用QRandomGenerator类的bounded()函数生成指定范围内的随机数,并将其添加到QList或QSet中。 4. 检查重复:在每次生成随机数时,可以使用contains()函数来检查当前生成随机数是否已经存在于QList或QSet中,若不存在则将其添加到容器中。这样可以保证生成随机数不重复。 5. 生成指定数量的随机数:根据需求,可以使用循环来重复步骤3和步骤4,直到生成指定数量的随机数。 以下是一个示例代码,用于生成指定范围内的不重复随机数: ```cpp #include <QRandomGenerator> #include <QList> QList<int> generateRandomNumbers(int min, int max, int count) { QList<int> randomNumbers; QRandomGenerator* generator = QRandomGenerator::global(); generator->seed(QTime::currentTime().msec()); while (randomNumbers.count() < count) { int randomNumber = generator->bounded(min, max+1); if (!randomNumbers.contains(randomNumber)) randomNumbers.append(randomNumber); } return randomNumbers; } ``` 在上述示例代码中,generateRandomNumbers函数接收三个参数:最小值min、最大值max和要生成随机数的数量count。函数返回一个QList<int>类型的随机数序列。 通过调用该函数,即可生成一组指定范围内的不重复随机数。例如: ```cpp int main(int argc, char *argv[]) { QList<int> randomNumbers = generateRandomNumbers(1, 10, 5); foreach (int randomNumber, randomNumbers) { qDebug() << randomNumber; } return 0; } ``` 上述代码生成了5个位于1到10之间的不重复随机数,并使用qDebug()函数输出到控制台。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值