我做的一个数字滚动器用来幸运抽奖,请问如果让出现过的数字不再出现,应该怎样改代码,请大家帮忙看看,谢谢!
用在联欢会的幸运抽奖,每个人手上都有一个号码,从1-200,FORM1上有个button,有人喊停的时候就按一下BUTTON,就在FORM上停留一个数字,我要求数字不要重复出现,避免一个人得两次奖。急呀,明天就开了,我就这10分,谢谢!procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Randomize;
  Label1.Caption:=IntToStr(Random(200));
end;
procedure TForm1.BtnBEClick(Sender: TObject);
begin
  Timer1.Enabled := not Timer1.Enabled;
     if Timer1.Enabled then
         BtnBE.caption := 停止'
     else
         BtnBE.caption := '开始';
end;

解决方案 »

  1.   

    今天才看到题目,如果需要我可以帮忙写下;
    设计思想可以这样,就是在界面上弄个按钮再额外加个LISTBOX用于保存已经抽取出的号码,这样每次抽取出的号码先跟LISTBOX中的项比较,不存在于LISTBOX就OK并加入至LISTBOX,已经存在的就继续抽取...
      

  2.   

    产生不重复随机数的简便算法   来源:互联网。产生不重复随机数的算法能够解决诸如随机洗牌,抽彩等问题,在网上的一些算法自觉较繁,现给出简单的算法。以下源程序为1..36个数字,随机排列,产生不重复随机数。 
    var aa : array[1..36] of string[2]; //aa数组为需要随机排列的数组,
    {先把1..36按顺序给aa数组赋值}
    procedure TForm1.FormCreate(Sender: TObject);
    var i:integer;
    begin
      for i:=1 to 36 do begin
          aa[i]:=inttostr(i);
          bb[i]:=inttostr(i);
      end;
    end;
    {随机进行排列}
    procedure TForm1.Button1Click(Sender: TObject);
    var i,j:integer;  swapa:string[2];
    begin
      randomize;
      for i:=1 to 36 do begin
          j:=1+random(36);
          swapa:=aa[i];
          aa[i]:=aa[j];
          aa[j]:=swapa;
      end;
    end; //由此得到不重复的随机排列数字
      

  3.   

    lihuasoft(学习低调做人) ( ) 信誉:100你的方法不断的点Button1会出现很多以前出现过的数字哦
      

  4.   

    -_-~!!!  只是给你一个思路而已......并不是在替你做程序员.....点Button生成一个随机数,即写入一个数组,再Button生成一个随机数,先查一查数组里有没有重复....
      

  5.   

    var
      sRdm: string = '';
      sGeted: string = ',';procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Randomize();
      sRdm := IntToStr(Random(200) + 1);
      if Pos(',' + sRdm + ',', sGeted) = 0 then
        Label1.Caption := sRdm;
    end;procedure TForm1.BtnBEClick(Sender: TObject);
    begin
      Timer1.Enabled := not Timer1.Enabled;
      if Timer1.Enabled then
      begin
        BtnBE.caption := '停止';
        sGeted := sGeted + sRdm + ',';
      end
      else BtnBE.caption := '开始';
    end;end.
    ==
    效率不高,试一下如何
      

  6.   

    .......最基本的代码简单的桶赛选啊
    开一个tf: array[1..1000000] of boolean的数组
    如果先内存太大,可以考虑用楼上的
    radomsize;
    t:=random(1000000);;
    if tf[t]=false then
    begin
      //你要的代码
    end;
      

  7.   

    虽然有点晚,还是贴上自己的一个想法,供大家参考交流!基本思路是:先初始化一个要选择随机数范围加1的数组,其中a[0]保存可用的随机数的个数,然后在a[0]范围内随机选取一个数,并把这个数与数字后面的数向交换,并将a[0]减1,直到最后全部取完,数组保存的是所取随机数顺序的倒序.定义常量和变量
    const
      NUM_COUNT = 10;var
      a: array[0..NUM_COUNT] of Integer;初始化
    var
      i: Integer;
    begin
      a[0] := NUM_COUNT;
      for i:=1 to NUM_COUNT do
        a[i] := i;
    end;得到不重复随机数,全部取完返回-1
    function GetRandom: Integer;
    var
      res, tmp: Integer;
    begin
      if a[0] = 0 then
      begin
        Result := -1;
        Exit;
      end;
      Randomize;
      tmp := Random(a[0])+1;
      Result := a[tmp];
      a[tmp] := a[a[0]];
      a[a[0]] := Result;
      a[0] := a[0] - 1;
    end;测试
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Ran: Integer;
    begin
      Ran := GetRandom;
      if Ran <> -1 then
        Memo1.Lines.Add(IntToStr(Ran))
      else
        Memo1.Lines.Add('随机数已经全部取完!');
    end;