我现在有三张题库表:选择题(id,题目,答案,a,b,c,d,章节),判断题(id,题目,答案,章节),主观题(id,题目,答案,章节),还有一张试卷库表(id,题目,题型,分值,时间)用来存放成套的试题的,里面的题目是从前三张表抽取出来组成的。现在我要实现在从三个题库表随机抽题到试卷库,这就遇到了一个问题:如果是随机的话那就不能保证是我要求的那个章节的试题了:
sql="SELECT * FROM xuanzeti WHERE id='"+j[i]+"' AND zhang='"+strid+"'"; J[i]是随机数组,strid是从表单获取到的章节属性,我要是把随机和按章节分开实现的话(只取其中一个)都可以抽到题,两个AND一起的话就不能实现了,我知道这是id='"+j[i]+",这一句就一定定位到一条记录了。
那么要怎样写才能抽到题目?
抽题时是同时从一张表单里获取信息:
关键如下:
随机函数:
void randomNum(int a[],int i,int j)
{
a[i]=1+(int)(Math.random()*j);
for(int c=i-1;c>=0;c--)
{
if(a[i]==a[c])
randomNum(a,i,j);
}
}
抽选择题的关键代码:
int xuanzeshumu=Integer.parseInt(request.getParameter("xuanzeshumu"));
int xuanzefenzhi=Integer.parseInt(request.getParameter("xuanzefenzhi"));
int panduanshumu=Integer.parseInt(request.getParameter("panduanshumu"));
int panduanfenzhi=Integer.parseInt(request.getParameter("panduanfenzhi"));
int zhuguanshumu=Integer.parseInt(request.getParameter("zhuguanshumu"));
int zhuguanfenzhi=Integer.parseInt(request.getParameter("zhuguantifenzhi"));
int kaoshishijian=Integer.parseInt(request.getParameter("kaoshishijian"));
int i=0;
int j[]=new int [30];
for(i=0;i<xuanzeshumu;i++)
{
randomNum(j,i,30);
sql="SELECT * from xuanzeti where id='"+j[i]+"'";
rs=con.getRs(sql);
rs.next();
int id=Integer.parseInt(rs.getString(1));
String timu=rs.getString(2);
String timuleixing="xuanzeti";
String sql1="insert into shijuan(shijuanbianhao,timu,fenzhi,timuleixing,id,kaoshishijian) values ('"+shijuanbianhao+"','"+timu+"','"+xuanzefenzhi+"','"+timuleixing+"','"+id+"','"+kaoshishijian+"')";
int intT=data.insert(sql1);
}
请问要怎样修改才能抽到题?
sql="SELECT * FROM xuanzeti WHERE id='"+j[i]+"' AND zhang='"+strid+"'"; J[i]是随机数组,strid是从表单获取到的章节属性,我要是把随机和按章节分开实现的话(只取其中一个)都可以抽到题,两个AND一起的话就不能实现了,我知道这是id='"+j[i]+",这一句就一定定位到一条记录了。
那么要怎样写才能抽到题目?
抽题时是同时从一张表单里获取信息:
关键如下:
随机函数:
void randomNum(int a[],int i,int j)
{
a[i]=1+(int)(Math.random()*j);
for(int c=i-1;c>=0;c--)
{
if(a[i]==a[c])
randomNum(a,i,j);
}
}
抽选择题的关键代码:
int xuanzeshumu=Integer.parseInt(request.getParameter("xuanzeshumu"));
int xuanzefenzhi=Integer.parseInt(request.getParameter("xuanzefenzhi"));
int panduanshumu=Integer.parseInt(request.getParameter("panduanshumu"));
int panduanfenzhi=Integer.parseInt(request.getParameter("panduanfenzhi"));
int zhuguanshumu=Integer.parseInt(request.getParameter("zhuguanshumu"));
int zhuguanfenzhi=Integer.parseInt(request.getParameter("zhuguantifenzhi"));
int kaoshishijian=Integer.parseInt(request.getParameter("kaoshishijian"));
int i=0;
int j[]=new int [30];
for(i=0;i<xuanzeshumu;i++)
{
randomNum(j,i,30);
sql="SELECT * from xuanzeti where id='"+j[i]+"'";
rs=con.getRs(sql);
rs.next();
int id=Integer.parseInt(rs.getString(1));
String timu=rs.getString(2);
String timuleixing="xuanzeti";
String sql1="insert into shijuan(shijuanbianhao,timu,fenzhi,timuleixing,id,kaoshishijian) values ('"+shijuanbianhao+"','"+timu+"','"+xuanzefenzhi+"','"+timuleixing+"','"+id+"','"+kaoshishijian+"')";
int intT=data.insert(sql1);
}
请问要怎样修改才能抽到题?
选择题目个数:(xuanzetishumu): 分值(xuanzefenzhi):
判断题目个数(panduantishumu): 分值(panduanfenzhi):
主观题目个数:(zhuguantishumu): 分值(zhuguanfenzhi):
考试时间(kaoshishijian): 试卷编号(shijuanbianhao):
提交
Set getSeq( rsNum, int num )
{
//rsNum是结果集的行数
//num是要求的题目数
bool bContinue = true;
Set set = new Set();
while(bContinue)
{
//获取随即值
int iRom = 1+(int)Rondom()*rsNum
if iRom 在 set内
{continue;}
else
{
扔到set里,然后判断set的行数是不是达到了num
if(set的行数达到了num)
{
bContinue = false;
}
}
}
return set;
}