在Delphi中生成三个随机字符

时间:2013-11-09 22:25:11

标签: delphi

您好我正在尝试使用Delphi中的函数生成三个随机字符,代码是:

function generate(cantidad: integer): string;
const
  letras_mi = 'abcdefghijklmnopqrstuvwxyz';
const
  letras_ma = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
const
  numeros = '0123456789';
var
  finalr: string;
begin

  finalr := '';

  finalr := finalr + IntToStr(Random(Length(letras_mi)) + 1);
  finalr := finalr + IntToStr(Random(Length(letras_ma)) + 1);
  finalr := finalr + IntToStr(Random(Length(numeros)) + 1);

  Result := finalr;

end;

问题在于,当我实际等待3个字符的常量随机变量时,像20142这样的东西回来了。

8 个答案:

答案 0 :(得分:18)

您的代码正在将整数索引值转换为字符串。请注意,您对常量的唯一引用是采用它们的长度。您返回索引而不是字符。

您可以使用生成的整数索引来修复代码,以引用字符串常量中的元素。梅森和肯展示了如何做到这一点。

就个人而言,我会取消常量并写下

Chr(ord('a') + Random(26))

Chr(ord('A') + Random(26))

Chr(ord('0') + Random(10))

这些字符的序数值是在允许这样的代码时设计的。

答案 1 :(得分:11)

您将Random的结果添加到finalr,而不是常量中的随机字母。

尝试这样的事情 - 它使用Random的返回值作为字符串常量字符的索引:

function generate(cantidad: integer): string;
const
  letras_mi = 'abcdefghijklmnopqrstuvwxyz';
  letras_ma = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  numeros = '0123456789';
begin
  Result := '';
  Result := Result + letras_mi[Random(Length(letras_mi)) + 1];
  Result := Result + letras_ma[Random(Length(letras_ma)) + 1];
  Result := Result + numeros[Random(Length(numeros)) + 1];
end;

答案 2 :(得分:10)

让我们看看你的代码在做什么,正如编译器所看到的那样:

IntToStr(Random(Length(letras_mi)) + 1)

Call IntToStr on the result of:
  Call Random on the result of:
    Add
      Length(letras_mi)
      1

IntToStr采用一个数字(例如5)并将其转换为字符串(例如'5')。你想要做的是使用随机值索引你的数组,如下所示:

letras_mi[Random(Length(letras_mi)) + 1]

答案 3 :(得分:1)

function RandomString(const ALength: Integer): String;
var
  i: Integer;
  LCharType: Integer;
begin
  Result := '';
  for i := 1 to ALength do
  begin
    LCharType := Random(3);
    case LCharType of
      0: Result := Result + Chr(ord('a') + Random(26));
      1: Result := Result + Chr(ord('A') + Random(26));
      2: Result := Result + Chr(ord('0') + Random(10));
    end;
  end;
end;

答案 4 :(得分:0)

更快的方法是避免重新分配内存时间。

function generate(cantidad: integer): string;
const
  letras_mi = 'abcdefghijklmnopqrstuvwxyz';
  numeros = '0123456789';
begin
  SetLength(Result, 3); // only alloc memory once

  Result[1] := letras_mi[Random(Length(letras_mi)) + 1];
  Result[2] := UpCase(letras_mi[Random(Length(letras_mi)) + 1]);
  Result[3] := numeros[Random(Length(numeros)) + 1];
end;

有时甚至会稍快一点,就是使用局部变量来避免对var-parameter UniqueString进行额外的Result调用。

但是,应该针对某个特定的编译器版本和选项进行时序或CPU级代码检查,以查看它实际产生的差异(如果有的话)。

function generate(cantidad: integer): string;
const
  letras_mi = 'abcdefghijklmnopqrstuvwxyz';
  numeros = '0123456789';
var local: string;
begin
  SetLength(local, 3); // only alloc memory once

  local[1] := letras_mi[Random(Length(letras_mi)) + 1];
  local[2] := UpCase(letras_mi[Random(Length(letras_mi)) + 1]);
  local[3] := numeros[Random(Length(numeros)) + 1];

  Result := local;
end;

PS。基于Ord的方法在这里也比从数组/字符串中选择char更好,但这是独立的问题。另外我会谨慎使用Chr函数与Delphi 2009或更新版本,它只能在#0 ..#127值上统一工作。明确声明类似AnsiChar(i)WideChar(i)的类型转换可能是更稳定的替代,因为有一天你需要7位子范围以外的字母,比如eña和其他欧洲特定的字母。

答案 5 :(得分:0)

这将生成看起来像单词的随机字符串。

function GenerateRandomWord(CONST Len: Integer=16; StartWithVowel: Boolean= FALSE): string;
CONST
   sVowels: string= 'AEIOUY';
   sConson: string= 'BCDFGHJKLMNPQRSTVWXZ';    
VAR
   i: Integer;
   B: Boolean;
begin
  B:= StartWithVowel;
  SetLength(Result, Len);
  for i:= 1 to len DO
   begin
    if B
    then Result[i]:= sVowels[Random(Length(sVowels)) + 1]
    else Result[i]:= sConson[Random(Length(sConson)) + 1];
    B:= NOT B;
   end;
end;

所以,像这样使用它:GenerateRandomWord(3);

答案 6 :(得分:0)

WorkspaceConfiguration

答案 7 :(得分:-1)

const
Alphabetdown = 'abcdefghijklmnopqrstuvwxyz' ;
procedure TForm1.Button1Click(Sender: TObject);
var
   sGeneratedAccNo : string ;

begin
    sGeneratedAccNo := sGeneratedAccNo + Alphabetdown[Random(Length(Alphabetdown) + 1)] ;
    showMessage(sGeneratedAccNo) ;