您好我正在尝试使用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这样的东西回来了。
答案 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) ;