如: 20H10EJZ5  20H10EJYR....当然 全是数字 也行 如:  9854  2361  但是我怀疑这样的 会重复 注意 每次产生的 必须是唯一的 如同createguid 但不要那么长的有这样的 函数吗 ?

解决方案 »

  1.   

    function RandomStr(const ALen: Integer): string;
    const
      s = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    Var
      i, l: Integer;
    begin
      l := Length(s);
      Randomize;  Result := '';
      for i:=0 to ALen-1 do
      begin
        Result := Result + s[Random(l)+1];
      end;
    end;
      

  2.   

    function RandomStr(const ALen: Integer): string; 
    const 
      s = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; 
    Var 
      i, l: Integer; 
    begin 
      l := Length(s); 
      Randomize;   Result := ''; 
      for i:=0 to ALen-1 do 
      begin 
        Result := Result + s[Random(l)+1]; 
      end; 
    end; 
      

  3.   

    刚测试了 一下  
    procedure TForm1.Button3Click(Sender: TObject);
    var i: Integer;
      lst: TStringList;
    begin
      try
        lst := TStringList.Create;    lst.Sorted :=True ;
        lst.Duplicates := dupIgnore;    for i := 1 to 10000 do    begin
          //Memo1.Lines.Add(RandomStr(4));
          lst.Add(RandomStr(4));
        end;    ShowMessage(IntToStr(lst.Count));  finally
        FreeAndNil(lst);
      end;
    end;
    好像和 随机数的数目和  长度有关系  我测试了一下 有重复的 但很少了 
      

  4.   

    呵呵  1楼的函数可以  我忘了 区分大小写了
    procedure TForm1.Button3Click(Sender: TObject);
    var i, j: Integer;
      lst: TStringList;
    begin
      try
        lst := TStringList.Create;    lst.Sorted := True;
        lst.Duplicates := dupIgnore;
        lst.CaseSensitive :=True ;              //字母有大小写     for j := 1 to 100 do
        begin
          lst.Clear;
          for i := 1 to 5000 do      begin
            //Memo1.Lines.Add(RandomStr(4));
            lst.Add(RandomStr(5));
            Application.ProcessMessages;
          end;    //ShowMessage(IntToStr(lst.Count));
          Memo1.Lines.Add(IntToStr(lst.Count));
          Application.ProcessMessages;
        end;
      finally
        FreeAndNil(lst);
      end;
    end;
    测试 了 100 次 没次 5000 个随机  没有重复的 呵呵 
      

  5.   

    随机的算法容易做,关键是要不重复的话,就得想办法排除掉已经产生过的了.
    要么记下已经产生过的结果串,要么记下上一次用于生成串的关键字(seed),下回从下一个开始
      

  6.   

    随机有可能重复
    想要多长?
    时间的,毫秒级
    s := formatDatetime('yymmddhhmmsszzz', now)
      

  7.   

    md5应该也不算长吧,短的16位而已,少了GUID一半。不过问题倒是说通过改时间,有可能能改出一样的编码来。对了,用时间串加上你那个随机串然后再MD5,我觉得重复的可能性已经接近0了。
      

  8.   

    随机出一个数再MD5+时间,毫秒级 
    s := formatDatetime('yymmddhhmmsszzz', now)
      

  9.   

    sql  server 2000 默认不区分大小写所以 1 楼的 函数不可行呀  重复的几率太大
    时间毫秒 大家都是这么采用的吗 ?我要把产生的 字符串作为主键数据 写入数据库的。
    操作是 当用户导入数据时 字符串+0001(序号) 为每一个数据做主键标识