随机显示问题


问题描述:
       在考试系统中,问题(包括各种题型),以及选择题的选项都要随机打乱顺序显示(防止作弊),很显然,随机显示是容易做到的,但是为了防止机器故障等因素导致学生考试中断,然后又要恢复考试,那么这一次随机显示的顺序和上一次应该是一样的。
      如何保证这一点,我曾经想法是把每道题目,每个选项的顺序给记下来,生成一个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中早就帮我完成的事情,我却浪费了很多时间,创新是必要的,前提是大量的学习。(但是能做的事情别人都做好了,有种英雄无用武之地的感慨。。。) 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值