大家好:
  现有随机数1、2、3、4、5、6、7、8、10、11、12、1200。如何随机的从里面抽出N个不重复的数。其中N是变化的.
谢谢!

解决方案 »

  1.   

    把现有的数放到一个数组r[n]里
    循环洗牌:
    for i:=1 to n do
    begin
      p:=random(n)+1;
      t:=r[p];
      r[p]:=r[i];
      r[i]:=t;
    end;
    再取数组的前m个,肯定是随机且不重复的
      

  2.   

    一般是把要随机的数都放到一个数组(a)里,取出随机数b:=random(N-1)后,用MOVE函数或者直接写一个函数把数字从取的那个元素开始都往前移一个,再用random(N-2)抽取,以此类推.
      

  3.   


    //以30个数为例
    var
      aaa:array[1..30] of integer;
      i,j,n: integer;
      s: integer;
    begin
      randomize;
      for i:=1 to 30 do
      begin
        aaa[i]:=random(100);
      end;
      for i:=1 to 29 do
      begin
        for j:=i+1 to 30 do
        begin
          if aaa[i]=aaa[j] then
          begin
            repeat
              n:=0;
              aaa[j]:=random(100);
              for s:=1 to i do
              begin
                if aaa[j]=aaa[s] then n:=n+1;
              end;
            until n=0;
          end;
        end;
      end;
    end;
      

  4.   

    var
      i,j:integer;
      str:string;
      swapa:string[2];
      aa:array[1..1200] of string[2];
    begin
      randomize;
      for i:=1 to 1200 do
      begin
        j:=1+random(1200);
        swapa:=aa[i];
        aa[i]:=aa[j];
        aa[j]:=swapa;
      end;
      for i:=1 to n do
        str:=str+aa[i]+':';
      showmessage(str);
    end;
      

  5.   

    谢谢大家的关注:
     我自己已经搞定了,代码如下:
    function Tfrmdraw03.CheckIsHave(int: integer): Boolean;
    var
      k:integer;
    begin
      for k:=0 to SpinEdit1.Value-1 do
      begin
        if RanArr[k] =int then
          result :=True;
      end;
      result :=False;
    end;
     
    procedure Tfrmdraw03.Timer1Timer(Sender: TObject);
    var
      sm: string;
      ss: string;
      i: integer;
    begin
      inherited;
      dlist.Clear;
      RanArr :=nil;
      SetLength(RanArr, SpinEdit1.Value);
      Randomize;
      for i:=1 to SpinEdit1.Value do
      begin
        sIndex:=Random(sCount);
        While (sIndex=0) or (CheckIsHave(sIndex)) do
        begin
          sIndex:=Random(sCount);
        end;
        RanArr[i-1] :=sIndex;
      end;
    end;