我有一组数据:
s1
s2
s3
s4
...
想要将其打乱排序:
s2
s5
s6
s4
s1
.....
该用什么算法,是用random这个函数吗?

解决方案 »

  1.   

    procedure Shuffle(var S: array of Integer);
    var
      I, J: Integer;
      T: Integer;
      L: Integer;
    begin
      Randomize;
      L := Length(S);
      for I := 0 to L - 1 do begin
        J := Random(L - I); //在所剩下的范围内
        T := S[L - I - 1 + Low(S)];
        S[L - I - 1 + Low(S)] := S[J + Low(S)];
        S[J + Low(S)] := T;
      end;
    end; { Shuffle }
      

  2.   

    你用的那个方法肯定不行,这样的话你的数组永远相同
    要在程序前面加上
    randseed(gettickcount());
    这样随机就不同了
      

  3.   

    这段是调用函数的
      n := Redit1.Lines.Count - 1;
      SetLength(arrSuff, n);
      Shuffle(arrSuff);  for i := 0 to Length(s) do
        begin
          Redit2.Lines.Add(Redit1.Lines.Strings[arrSuff[i]]);
        end;
    这段是加在你给我的函数里面的
      

  4.   

    procedure Shuffle(var S: array of Integer);
    var
      I, J,K: Integer;
      T: Integer;
      L: Integer;
    begin
      Randomize;
      L := Length(S);
      for i:=0 to L-1 do
        s[i]:=i;  for i:=0 to L-1 do
      begin
        j:=Random(L);
        k:=Random(L);
        T:=s[j];
        S[j]:=s[K];
        s[k]:=T;
      end;
    end; { Shuffle }
      

  5.   

    行了!
    谢谢 : hiflower(花) 、 zswangII(伴水清清)(一贴不灌,何以灌天下?) 和大家!
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      i: Integer;
      arrSuff: array of Integer;
    begin
      SetLength(arrSuff, Redit1.Lines.Count);
      for i := 0 to Redit1.Lines.Count - 1 do
        arrSuff[i] := i;
      Shuffle(arrSuff);  Redit2.Clear;
      for i := 0 to Redit1.Lines.Count - 1 do
        Redit2.Lines.Add(Redit1.Lines[arrSuff[i]]);
    end;