问题描述:
在考试系统中,问题(包括各种题型),以及选择题的选项都要随机打乱顺序显示(防止作弊),很显然,随机显示是容易做到的,但是为了防止机器故障等因素导致学生考试中断,然后又要恢复考试,那么这一次随机显示的顺序和上一次应该是一样的。
如何保证这一点,我曾经想法是把每道题目,每个选项的顺序给记下来,生成一个xml文件,作为配置文件,每次在入试题的时候首先看配置文件中有没有随机信息,若有则按配置文件现实;若没有则随机显示,并将随机信息保存起来。
以上做法是愚蠢的。
解决方案:
java6 中(目前用的是java6,别的版本没有考虑),实现了List接口的容器都可以使用java.util.Collections的静态方法shuffle打乱显示顺序
试验代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class UtilTest {
public static void main(String[] arsgs){
int k = 0;
List<Integer> list ;
while (k++<10) {
System.out.print("第"+k+"轮:/t");
list = new ArrayList<Integer>(10);
for (int i = 0; i < 10; i++) {
list.add(i);
}
Collections.shuffle(list);
for (int i : list) {
System.out.print(i + " ");
}
System.out.println();
}
}
}
运行结果:
第1轮: 7 3 6 5 1 2 9 0 8 4
第2轮: 9 6 4 0 2 5 1 8 3 7
第3轮: 5 7 3 8 9 6 4 1 2 0
第4轮: 5 8 7 4 3 0 2 1 6 9
第5轮: 8 0 7 3 4 2 9 6 1 5
第6轮: 5 2 4 9 0 1 8 7 3 6
第7轮: 8 2 4 9 0 6 7 1 5 3
第8轮: 5 2 4 6 3 0 8 1 7 9
第9轮: 4 3 2 0 5 8 7 1 6 9
第10轮: 2 8 5 3 1 4 0 9 6 7
很显然,每一轮结果都不一样,达到了随机显示的效果,如何保证每次随机的顺序一样呢?shuffle方法可以接受一个随机源java.util.Random对象,只要随机源一样,打乱的顺序就一样,代码改成:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class UtilTest {
public static void main(String[] arsgs){
int k = 0;
List<Integer> list ;
while (k++<10) {
System.out.print("第"+k+"轮:/t");
list = new ArrayList<Integer>(10);
for (int i = 0; i < 10; i++) {
list.add(i);
}
Collections.shuffle(list, new Random(20));
for (int i : list) {
System.out.print(i + " ");
}
System.out.println();
}
}
}
运行结果:
第1轮: 8 2 6 4 0 5 9 1 7 3
第2轮: 8 2 6 4 0 5 9 1 7 3
第3轮: 8 2 6 4 0 5 9 1 7 3
第4轮: 8 2 6 4 0 5 9 1 7 3
第5轮: 8 2 6 4 0 5 9 1 7 3
第6轮: 8 2 6 4 0 5 9 1 7 3
第7轮: 8 2 6 4 0 5 9 1 7 3
第8轮: 8 2 6 4 0 5 9 1 7 3
第9轮: 8 2 6 4 0 5 9 1 7 3
第10轮: 8 2 6 4 0 5 9 1 7 3
显示顺序一样了。当然,要给Random对象一个固定的种子(上面的20),这样保证随机源是一样的,这样,每个考生只要保存一个种子(刚开始的时候生成一个),就可以保证中断考试后再恢复考试随机显示的效果一样了。
教训:
其实jdk中早就帮我完成的事情,我却浪费了很多时间,创新是必要的,前提是大量的学习。(但是能做的事情别人都做好了,有种英雄无用武之地的感慨。。。)
随机显示问题
最新推荐文章于 2024-07-15 15:48:46 发布