考试随机抽题问题:
  在MS SQL Server 数据库中有一个题库,每次考试时要随机抽40道题,我的解决方案是
用两个数组,一个是动态分配的,一个放随机抽的题。题库中的编号放在动态数组中,然后从动态数组里面抽题,放到另一个数组中,但是可能会有重复的数据,我该怎样避免这个问题!
  或者谁有更好的解决方案!
  Thank a lots

解决方案 »

  1.   

    正因为用了Random()才有重复的数据!
    大家看:Dsj: Array of String;
    DKT[0..39] : Array of String;setLength(Dsj,Query1.RecordCount);
    for i:=0 to Query1.RecordCount-1 do
    begin
      Dsj[i]:=Query1.Fields[0].Asstring;
    end;
    for i:=0 to 39 do
    begin
      Dkt[i]:=Dsj[Random(Query1.RecordCount)];
    end;这样的话Dkt数组中会有重复的数据。
    可以检测Dkt数组中的重复数据,但会太慢...
    怎么办....
      

  2.   

    你用两个数据a1[0....100]先给这个数组付值为0到100。
    然后再定义a2[0....x]x为你要选取择多少个随机数的多少。
    你先随机的从a1[0..100]选取一个数。`。将这个值付给a2[0]再将这个数从a1[0..100]从删除
    后面的数向前移。这样下去就可以了。
    这样可以避免第一位朋友那样说的。如10个数中选9个。可以永远都得不到最后那一个数。
      

  3.   

    我觉得移动数据比检测是否要慢。我觉得把a2[ 0..x ]用来保存RecordNo不是好一些,再检测有没有重复的RecordNo,一张试题的题量不要太大了,会考死人的。
      

  4.   

    我觉得用一个变量保存上一次取得随机数,比较一下有没有重复。
    var 
      int OldRadomNum;
      int NowRadomNum;
    OldRAdomNum = -1;
    for i:=0 to 39 do
    begin
      do
      begin
        NowRAdomNum = Random(Query1.RecordCount);        
      end while(NowRadomNum = OldRadomNum);
      Dkt[i]:=Dsj[NowRadomNum];
      OldRadomNum = NowRadomNum;
    end;
      

  5.   

    你建立一个数组阿,boolean类型的阿,40个元素阿,抽取了题目就至数组元素为true,然后以后随机数抽到试题,就看看这个试题的数组是否为true,是的话,那么就不要这个题目!!