我现在有三张题库表:选择题(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);
}
请问要怎样修改才能抽到题?

解决方案 »

  1.   

    抽题目的表单信息如下:
    选择题目个数:(xuanzetishumu):       分值(xuanzefenzhi):
    判断题目个数(panduantishumu):       分值(panduanfenzhi):
    主观题目个数:(zhuguantishumu):       分值(zhuguanfenzhi):
    考试时间(kaoshishijian):     试卷编号(shijuanbianhao):
                                 提交
      

  2.   

    //返回一个集合
    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;
    }