我的问题是这样的..我添加了两个label分别为:label1,label2;还有一个按钮btn1Click
假设label1=300,
        label2=3,点击btn1Click,就能得到这样的结果。label1=300,这里的300,意思是程序从000-999 一千个数里随机抽取300个不重复的数字,
label2=3,这里的3的意思是:随机3次,这3次随机的结果不能完全一样,
最后把这3次随机结果写入到文本里,名字分别为test1.txt ,test2.txt ,test3.txt 请教各位老师,要如何写代码....在发帖前尝试过问度娘了.

解决方案 »

  1.   

    用随机数啊
    for i:=0 to 次数-1 do
    获取到随机数,判断取到的是否与之前的相同,相同则重新获取
    最后就是一个写入文件的动作。
    思路大概就是这样的,代码的话没时间去帮你写了。
      

  2.   

    谢谢mathsfan 老师的提示
      

  3.   


    因为生成的随机数重复问题 (从000-999 不到1000 个的范围里面,抽取几百个, 重复的机率很高了,  所以这里不应该用for 循环吧用 while 循环应该好控制点.  获取的随机数, 没达到要求,就继续生成.
      

  4.   

    用while循环比较好,取0-1000中的随机数,取到后检查一个TStringList中有没有,没有则插进去,并且个数加1.
    直到个数加到了300,用TStringList的savetofile保存到txt中就行了。
    如果要保存3个且不相同,我不明白是不相同是什么意思,是里面的数相同但顺序不同算相同吗,如果要求数不完全相同,需要排序后挨个比较。如果确定三个TStringList都不相同,再逐个保存到txt中。
      

  5.   

    你弄0-999的数据放在List中.
    然后随机取一个以后就把该数从List中删除,再从List中随机
      

  6.   

    嗯 ...我找到 一个 VBA的 洗牌法..应该 抽牌算法 一样...我看看吧...盼各位老师 写写代码.好借鉴学习啊
      

  7.   

    procedure GetNum(ACount: Integer; AStr: TStrings);
    var
      Arr: Array of Integer;
      i, iValue: Integer;
    begin
      SetLength(Arr, 1000);
      i := 0;
      Randomize;
      while i < ACount - 1 do
      begin
        iValue := Random(1000);
        if Arr[iValue] = 0 then
        begin
          AStr.Add(IntToStr(iValue));
          Inc(i);
        end;
      end;
      SetLength(Arr, 0);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      t: TStringList;
      i, iCount, iNum: Integer;
    begin
      iCount := 300;//这个数字如果需要也可以随机
      iNum := 3; //这个数字如果需要也可以随机
      t := TStringList.Create;
      for i := 1 to iNum do
        begin
         t.Clear;
         GetNum(iCount, t);
         t.SaveToFile(ExtractFilePath(Application.ExeName) + 'Text' + IntToStr(i) + '.txt');
        end;
      FreeAndNil(t);
    end;
      

  8.   

    procedure GetNum(ACount: Integer; AStr: TStrings);
    var
      Arr: Array of Integer;
      i, iValue: Integer;
    begin
      SetLength(Arr, 1000);
      i := 0;
      Randomize;
      while i < ACount - 1 do
      begin
        iValue := Random(1000);
        if Arr[iValue] = 0 then
        begin
          Arr[iValue] := iValue;//不好意思,漏了句
          AStr.Add(IntToStr(iValue));
          Inc(i);
        end;
      end;
      SetLength(Arr, 0);
    end;
      

  9.   

    谢谢 baidu_21144645   老师....我测试一下
      

  10.   

    先把0..999加到List中去,然后random抽出来,取一个就删一个
      

  11.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      I, nIdx :Integer;
      LoadList :TStringList;
      sGet :String;
    begin
      LoadList := TStringList.Create;
      for I := 0 to 999 do LoadList.Add(IntToStr(I));  for I := 0 to 2 do begin //抽取3个,则0..2
        nIdx := Random(LoadList.Count);
        sGet := LoadList.Strings[nIdx];
        LoadList.Delete(nIdx);
      end;
    end;sGet 中的内容每次都不会相同
      

  12.   

    取完了记得释放LoadList哦