当前位置: 代码迷 >> J2SE >> 关于随机生成指定分值的试卷有关问题
  详细解决方案

关于随机生成指定分值的试卷有关问题

热度:118   发布时间:2016-04-24 02:19:34.0
关于随机生成指定分值的试卷问题
题库里有三种题型,选择,判断,填空。而每道题都有各自的分值,即同样是选择题也有1,2,3分的差别。

现在要指定每种题型的题目数量来组成试卷,还指定试卷的总分,比如100分。

假定题库不会出现题目不够的情况,求好点的思路,能贴出相关代码最好~

谢谢


------解决方案--------------------
思路,获取总题目数,然后先每个题目设置1分,然后看100-总分后还剩多少分
循环剩余分数,随机取1道题加1分,如果加到最大3分,则排除出下一次随机,直到剩余分数用完
最后再把所有的题目随机打乱一次顺序

for example
Java code
public static void randomTest(int[] tests) {    if (tests == null || tests.length == 0) {        System.out.println("error");        return;    }    int sum = 0;    for (int i : tests) {        sum += i;    }    if (sum > 100) {        System.out.println("error");        return;    }    List<Integer> questions = new LinkedList<Integer>(); //题目    List<Integer> maxScore = new ArrayList<Integer>(); //最大分数    for (int i=0; i<sum; i++) {        questions.add(1);    }    int remain = 100 - sum;    while (remain > 0) { //剩余分数还有        int s = questions.remove((int)Math.random()*(questions.size()));        s++; //随机取一道题加1分        if (s == 3) { //如果分数最大,则排除下一次随机            maxScore.add(s);        } else { //否则继续参与下一次随机            questions.add(s);        }        remain--;    }    questions.addAll(maxScore); //获得所有题目    Collections.shuffle(questions); //随机排列所有题目    for (int i=0; i<sum; i++) { //打印题目        if (i < tests[0]) {            System.out.printf("select question, score[%d]\n", questions.get(i));        } else if (tests.length > 1 && i < tests[0] + tests[1]) {            System.out.printf("judgment question, score[%d]\n", questions.get(i));        } else {            System.out.printf("filling blank question, score[%d]\n", questions.get(i));        }    }}
------解决方案--------------------
每种类型的题目都是固定个数,每种类型在题库里面随机抽取
------解决方案--------------------
思路,获取总题目数,然后先每个题目设置1分,然后看100-总分后还剩多少分
循环剩余分数,随机取1道题加1分,如果加到最大3分,则排除出下一次随机,直到剩余分数用完
最后再把所有的题目随机打乱一次顺序

for example

Java code

public static void randomTest(int[] tests) { if (tests == null || tests.length == 0) { System.out.println("error"); return; } int sum = 0; for (int i : tests) { sum += i; } if (sum > 100) { System.out.println("error"); return; } List<Integer> questions = new LinkedList<Integer>(); //题目 List<Integer> maxScore = new ArrayList<Integer>(); //最大分数 for (int i=0; i<sum; i++) { questions.add(1); } int remain = 100 - sum; while (remain > 0) { //剩余分数还有 int s = questions.remove((int)Math.random()*(questions.size())); s++; //随机取一道题加1分 if (s == 3) { //如果分数最大,则排除下一次随机 maxScore.add(s); } else { //否则继续参与下一次随机 questions.add(s); } remain--; } questions.addAll(maxScore); //获得所有题目 Collections.shuffle(questions); //随机排列所有题目 for (int i=0; i<sum; i++) { //打印题目 if (i < tests[0]) { System.out.printf("select question, score[%d]\n", questions.get(i)); } else if (tests.length > 1 && i < tests[0] + tests[1]) { System.out.printf("judgment question, score[%d]\n", questions.get(i)); } else { System.out.printf("filling blank question, score[%d]\n", questions.get(i)); } } }

  相关解决方案