【发布时间】:2021-03-05 10:01:57
【问题描述】:
我有一个生成随机密码的函数:
function GeneratePassword(ALength: Integer; Mode: TPasswordMode): string;
const
cLower = 'abcdefghijklmnopqrstuvwxyz';
cUpper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
cNumbers = '0123456789';
cExtra = '_.';
var
i : Integer;
S : string;
iM: BYTE;
begin
if Mode = [] then Exit;
i := 0;
Randomize;
while (i < ALength) do
begin
iM := RANDOM(4);
case iM of
0: if (pmLower in Mode) then begin
S := S + cLower[1+RANDOM(Length(cLower))];
Inc(i);
end;
1: if (pmUpper in Mode) then begin
S := S + cUpper[1+RANDOM(Length(cUpper))];
Inc(i);
end;
2: if (pmNumbers in Mode) then begin
S := S + cNumbers[1+RANDOM(Length(cNumbers))];
Inc(i);
end;
3: if (pmExtra in Mode) then begin
S := S + cExtra[1+RANDOM(Length(cExtra))];
Inc(i);
end;
end;
end;
Result := S;
end;
如何使这个函数使大写字母和特殊字符只出现一次,但总是出现?有时我生成密码时没有大写字母或特殊字符。
【问题讨论】:
-
或者:绘制
ALength-2common chars;画一个大写字母并将其插入随机位置;绘制一个特殊字符并将其插入到随机位置。 -
另一种方法:生成后,您现在可以扫描结果,如果缺少字符类型(大写字母或特殊字符),则在随机位置显式添加一个。
-
或者先添加所需的单个字符,然后添加其余字符,最后随机打乱结果。
-
就个人而言,这里提出的所有想法@dsm 似乎是最好的。不过要小心使用适当的随机播放,这是之前很多问题的主题。
-
@David 插入比随机播放结果更快。
标签: delphi