思路:
1、将题库中符合条件的题目的题目序号查询出来放到一个list集合中。
2、根据list的size获取0-size之间的随机数,如此便可保证第三步中不会出现下标越界的情况。
3、从list中获取下标为随机数的题目序号。
可能存在的问题:判断随机数是否重复
以下为实现过程和代码:
Java代码 收藏代码
public class TestRandom2 {
public static void main(String[] args) {
//生成100到题目进行简单测试
List list = new ArrayList();
for(int i=0;i<100;i++){
list.add(i+1);//以(i+1)的值作为题目序号
}
String ids = getExamIDs(list,20);//从100道题目中抽20道
System.out.println("随机抽取的题目序号为:"+ids);
//output:随机抽取的题目序号为:51,13,64,11,78,61,66,67,81,21,16,86,24,25,69,12,72,28,1,37
}
/**
* 该方法用来获取抽取题目的序号
* @param list:指定的题目集合
* @param count:抽题数量
* @return String字符串,以逗号隔开
* **/
public static String getExamIDs(List list,int count){
StringBuffer ids = new StringBuffer();
//1、校验不能为空
if(list==null || list.size()<=0) return null;
if(count<=0) return null;
//2、进行抽题
Random random = new Random();
Set set = new HashSet();
Integer randomNum = 0;
for(int i=0;i<count;i++){
//System.out.println("次数:"+i);
randomNum = random.nextInt(list.size());
while(isRepeat(randomNum.toString(),set)){//若重复就自动再次自动生成
randomNum = random.nextInt(list.size());
}
set.add(randomNum);//不重复的值保存到set中
//System.out.println("最后的随机数"+num);
ids.append(","+list.get(randomNum).toString());
}
String id=null;
if(ids.length()>1) id = ids.substring(1);//将第一个逗号去掉
return id;
}
/**
* 该方法用来判断是否重复
* @param num:指定的是否重复的数据
* @param set:集合,num在该集合冲查找是否重复
* @return flag:true或者false,true-重复 false-不重复
* **/
public static boolean isRepeat(String num,Set set){
boolean flag = false;//true-表示重复 false-表示不重复
if(num==null || num.trim().length()<=0) return true;
//hashSet为空或者它没有结果集合,也就是说是第一次,那么一定不会重复
if(set==null || !set.iterator().hasNext()) return false;
String value="";
for(Iterator it=set.iterator();it.hasNext();){
value = it.next().toString();
//System.out.println("set中的值:"+value+"\n传过来的随机数:"+num);
//说明两者相同,那就是重复了
if(num.equalsIgnoreCase(value)){
flag=true;
break;
}
}
//System.out.println("结果值:"+flag);
return flag;
}
} |
|