这个程序主要是用来随机抽取数据库中的记录
但是要不能重复
我想先把随机数存放到一个数组里去
检查它里面有没有重复的,有的话就要再一次随机
代码如下
procedure TForm1.Button3Click(Sender: TObject);
var
zancun:array[0..100] of integer;
flag:integer;
m,o,i,j,h,n:integer;
begin
   randomize;
   m:=0;
   n:=0;
   h:=StrToInt(edit1.Text);
   for j:=0 to h-1 do
    begin
     flag:=random(10)+1;
     for o:=0 to m do
     begin
     if  flag=zancun[o] then
       showmessage('有重复数!');
       //主要的思想是在这里想做个一检查,发现重复就返回上一层
    如何使它发现了重复就可以返回去做random(10)+1这个动作呢?
      end;
      zancun[j]:=flag;
      m:=m+1;
    end;
    for n:=0 to h-1 do
    begin
     listbox1.Items.Add(IntToStr(zancun[n]));
    end;
end;希望高手能帮我解决一下,我是新手分 不多
希望能理解啊

解决方案 »

  1.   

    这个是个老问题
    思路是这样的:看成从一副完整的牌中抽出N张牌首先你需要产生一副完整的牌 //1、2、3、4...N
      //添加到列表中
        for I := 1 to N do
          vList.Add(Pointer(I));
    从这一副牌中随机抽出牌 ()
      //从列表中取出后并从列表中删除
        for I := 1 to M do
        begin
          J := Random(vList.Count);
          vData := Integer(vList[J]);
          vList.Delete(J);
          Memo1.Lines.Add(IntToStr(vData));
        end;//参考如下代码
    procedure TForm1.Button1Click(Sender: TObject);
    var
      vList: TList;
      I, J: Integer;
      N, M: Integer;
      vData: Integer;
    begin
      Memo1.Clear;
      vList := TList.Create;
      try
        N := 10;
        M := 5;
        for I := 1 to N do
        begin
          vList.Add(Pointer(I));
        end;    for I := 1 to M do
        begin
          J := Random(vList.Count);
          vData := Integer(vList[J]);
          vList.Delete(J);
          Memo1.Lines.Add(IntToStr(vData));
        end;
      finally
        vList.Free;
      end;
    end;
      

  2.   

    再问一个问题
    希望能给我回答一下我得到的随机数是数据库中的序列好现在想把随机抽取的记录添加到另一张表中怎么写这个代码呢?用的是ADO组件,谢谢啊,明天结帖了,呵呵!
      

  3.   

    1、如果取出数目固定那就洗牌算法,如果不固定,直接用递归更简单直接些。
    2、
    adoquery.sql.clear;
    adoquery.sql.add('select xxx,xxx,xx,xxx into 另一张表名 from xxx表名 where 序列号 in 随机数');
    adoquery.execsql;
      

  4.   

    通过查询实现如果SQL Server可以用:
    select top 10 * 
    from TableName 
    order by NewID()如果是Access可以用: //编号即你的序号关键字段
    select top 5 * 
    from TableName 
    order by rnd(编号 + Time())
      

  5.   

    说个方法,把所有要随机抽的数据放在TList里,每次取的数据是(比如是整形)
    function GetData:Integer;
    var
    Idx:integer;
    begin
      if List.Count=0 then
      begin
        Result:=-1;
        exit;
      end;
      Idx:=random(List.Count);
      Result:=PInteger(List.Item[Idx]);
      List.Delete(Idx);
      Dispos(List.Item[Idx);
    end;