我一个字符串(是一组正常数据包),我只要在其中随机取出10%的字符出来,重新进行组包,然后发送
请问这样的算法怎么实现

解决方案 »

  1.   

    var
      S: string;
      T: string;
      I: Integer;
      J: Integer;
    begin
      Randomize;
      S := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
      T := '';
      for I := 1 to Trunc(Length(S) * 0.1) do
      begin
        J := 1 + Random(Length(S)); //得到源字符串随机位置
        T := T + S[J]; //将这个位置的字符串追加到结果中
        Delete(S, J, 1); //删除源字符串该位置的字符
      end;
      Caption := T; //输出结果
    end;
      

  2.   

    //如果按照你提供的格式,处理方法是一样的
    var
      vSource: TStringList;
      vDest: TStringList;
      I: Integer;
      J: Integer;
    begin
      Randomize;  vSource := TStringList.Create;
      vDest := TStringList.Create;
      vDest.Delimiter := '#';
      vSource.Delimiter := '#';
      vSource.DelimitedText :=
    '5518001,0.01,0#5518020,0.13,1#123456,5.35,0#5518001,0.03,0#5518001,0.04,0#5518001,0.05,0#5518001,0.07,0#5518001,0.06,0#5518001,0.01,0#5518020,0.13,1#123456,5.35,0#5518001,0.03,0#5518001,0.04,0#5518001,0.05,0#5518001,0.07,0#5518001,0.06,0#';
      vDest.Clear;
      for I := 1 to Trunc(vSource.Count * 0.1) do
      begin
        J := Random(vSource.Count); //得到源字符串随机位置
        vDest.Add(vSource[J]); //将这个位置的字符串追加到结果中
        vSource.Delete(J); //删除源字符串该位置的字符
      end;
      Caption := vDest.DelimitedText; //输出结果
      vSource.Free;
      vDest.Free;
    end;