我想写一个函数,存放指定范围内产生的随机数,到一个数组里,但是每次产生的随机数不能重复。例如:我想产生2-5之间的随机数(包括2和5本身,也就是2、3、4、5)存放在一个数组里,每次产生的这4个随数,不能重复,也不能和上一次产生的顺序相同。谢谢!!!

解决方案 »

  1.   

    如果用radam,是伪随机数,所以每一次都会产生一样的,
    可以先获得一个唯的值,再经过算法变成一定范围内的数
    比如获得时间,然后再算,算法可以自己吧。
      

  2.   

    //思路是先得到一副完整的排列数据~~
    //然后每次从其中随机抽取一个元素,并删除~~
    //参考如下代码~~
    function Collocate(mStrings: TStrings; mStr: string): Boolean; { 全排列 }
      procedure pCollocate(mLeft, mRight: string);
      var
        I, L: Integer;
        Temp: string;
      begin
        L := Length(mLeft);
        if L = 0 then
          mStrings.Add(mRight)
        else for I := 1 to L do begin
          Temp := mLeft;
          Delete(Temp, I, 1);
          pCollocate(Temp, Concat(mRight, mLeft[I]));
        end;
      end;
    begin
      Result := False;
      if not Assigned(mStrings) then Exit;
      mStrings.BeginUpdate;
      try
        mStrings.Clear;
        pCollocate(mStr, '');
      finally
        mStrings.EndUpdate;
      end;
      Result := True;
    end; { Collocate }procedure TForm1.FormCreate(Sender: TObject);
    begin
      FStringList := TStringList.Create;
      Randomize; //播下随机种子
      Collocate(FStringList, '2345'); //得到'2345'所以的排列,放在FStringList中
    end;function StringSwell(mString: string;
      mDelimiter: string = ''): string; { 格式处理 }
    var
      I: Integer;
    begin
      Result := '';
      for I := 1 to Length(mString) do
        Result := Result + mDelimiter + mString[I];
      Delete(Result, 1, Length(mDelimiter));
    end; { StringSwell }procedure TForm1.FormDestroy(Sender: TObject);
    begin
      FStringList.Free;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
    begin
      if FStringList.Count <= 0 then
      begin
        ShowMessage('已经没有元素可以抽取');
        Exit;
      end;
      I := Random(FStringList.Count); //从所剩的元素中随机抽取
      ShowMessage('本次抽取的元素为:' + StringSwell(FStringList[I], ','));
      FStringList.Delete(I); //抽取后就删除掉
    end;