大虾们:
   我想从1到100的数中随机取30个不同的数?
   函数该怎么写?最好前一次的30个数和后一次的30个数不同!

解决方案 »

  1.   

    效率很低,别笑我,我是二把刀;
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        ListBox1: TListBox;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      myarray=array[0..29] of integer;
    var
      Form1: TForm1;implementation{$R *.dfm}
    function judgenotin(userint:integer;tmp:myarray):boolean;
    var
      i:integer;
    begin
      for i:=0 to 29 do
      begin
        if userint=tmp[i] then
        begin
          result:=false;
          exit;
        end;
      end;
      result:=true;
    end;
    function get30random:myarray;
    var
      tmp:myarray;
      i,userint:integer;
    begin
     // fillchar(tmp,30,0);
      for i:=0 to 29 do
      begin
        tmp[i]:=0;
        while true do
        begin
          randomize;
          userint:=random(101);
          if judgenotin(userint,tmp) then
          begin
            tmp[i]:=userint;
            break;
          end;
        end;  end;
      result:=tmp;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      dd:myarray;
      i:integer;
    begin
      dd:=get30random;
      listbox1.Clear ;
      for i:=0 to 29 do
      begin
        listbox1.Items.Add(inttostr(dd[i]));
      end;
    end;end.
      

  2.   

    给个思路,用个数组,第一次从Arr[0]-Arr[29]中里选,选完后如果不是最后一个数交换Arr[30]和随机选中数Arr[i]的位置,第二次就从Arr[0]-Arr[28]中选,依此类推,这样做效率比较高~~
      

  3.   

    是从0-99,不是29示例程序:var
      NumArr:array[0..99] of integer;
      GetNumArr:array[0..29] of integer;
      i:Integer;  procedure GetNum;
      var
        i:integer;
      begin
        for i:=Low(NumArr) to High(NumArr) do
          NumArr[i]:=i+1;
        Randomize;
        for i:=Low(GetNumArr) to High(GetNumArr) do
        begin
          GetNumArr[i]:=NumArr[Random(High(NumArr)+1-i)];
          if GetNumArr[i]<>NumArr[High(NumArr)] then
          begin
            NumArr[i]:=NumArr[High(NumArr)+1-i];
          end;
        end;
      end;
      

  4.   

    用如下代码: 
     ........
      var i,n          : integer;
          v            : array[1..100] of boolean;
          t            : integer;
      begin
       randomize;
       fillchar(t,sizeof(t),false);
       t := 0; 
         for i := 1 to 30 do
          begin
           n := random(100);
           if [i]
      

  5.   

    哎呀,按错键了!正确的应该是:
     ........
      var i,n          : integer;
          v            : array[1..100] of boolean;
          t            : array[1..30] of integer;//存结果 
      begin
       randomize;
       fillchar(v,sizeof(v),false);
       fillchar(t,sizeof(t),0);
         for i := 1 to 30 do
          begin
           n := random(100);
           while v[n]=true do n := random(100);
           if v[n]=false then begin v[n] := true; t[i] := n; end;
      end;
     ..................
      

  6.   

    我不想再写了,随便写一个都和楼上的重复了..sigh...
    来晚啦!
      

  7.   

    ehom大哥:
    30个数中还有两个是重复的?
      

  8.   

    我现在想:
          如果是对后台数据库里的若干记录进行随机取数,那应该是怎样呢?
    即SQL的语句怎样写?
      

  9.   

    不好意思,昨天随手写的程序有错误!var
      NumArr:array[0..99] of integer;
      GetNumArr:array[0..29] of integer;
      i:Integer;  procedure GetNum;
      var
        i,n:integer;
      begin
        for i:=Low(NumArr) to High(NumArr) do
          NumArr[i]:=i+1;
        Randomize;
        for i:=Low(GetNumArr) to High(GetNumArr) do
        begin
          n:=Random(High(NumArr)+1-i);
          GetNumArr[i]:=NumArr[n];
          if GetNumArr[i]<>NumArr[High(NumArr)] then
          begin
            NumArr[n]:=NumArr[High(NumArr)+1-i];
          end;
        end;
      end;//其实判断语句也可以去掉,加上只是为了更好理解
      

  10.   

    ehom大哥:
      好象今天的程序和昨天的没啥区别呀!只是把
    GetNumArr[i]:=NumArr[Random(High(NumArr)+1-i)];
    换成了n:=Random(High(NumArr)+1-i);
          GetNumArr[i]:=NumArr[n];
    结果也是30个数中还有相同的数!
      

  11.   

    有个RandomFrom函数,配合ehom(?!) 兄的方法应该很方便
    function RandomFrom(const AValues: array of Double): Double; overload;
    function RandomFrom(const AValues: array of Integer): Integer; overload;
    function RandomFrom(const AValues: array of Int64): Int64; overload;
    function RandomFrom(const AValues: array ofstring): string; overload;DescriptionRandomFrom returns a randomly selected element from the array passed as the AValues argument.
      

  12.   

    ehom大哥:
      你的意思是从数组中随机取一个数A,然后把取过的这个数A从数组中删掉
    再从剩下的数中取下一个数B.对不对呀?