- Код: Выделить всё
- program gen_password;
 uses
 SysUtils;
 // Math;
 // character;
 function randomPoisson(mean: integer): integer;
 { Generator for Poisson distribution (Donald Knuth's algorithm) }
 const
 RESOLUTION = 1000;
 var
 k: integer;
 b, l: ValReal;
 begin
 assert(mean > 0, 'mean < 1');
 k := 0;
 b := 1;
 l := exp(-mean);
 while b > l do
 begin
 k := k + 1;
 b := b * random(RESOLUTION) / RESOLUTION;
 end;
 Result := k - 1;
 end;
 const
 Keywords = '!$%&0123456789<>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';
 KeywordsLength = Length(Keywords);
 function makePass1: string;
 var
 I, J, K: integer;
 tmp: string;
 // PassLen: integer;
 c: char;
 code, MaxCycles: integer;
 begin
 tmp := Keywords;
 // code := 1234;
 MaxCycles := 255;
 // RandSeed := code;
 Randomize;
 for i := 1 to MaxCycles do
 begin
 j := trunc(KeywordsLength * random) + 1;
 k := trunc(KeywordsLength * random) + 1;
 c := tmp[j];
 tmp[j] := tmp[k];
 tmp[k] := c;
 end;
 I := randomPoisson(KeywordsLength shr 1);
 Writeln(I);
 Result := '';
 repeat
 c := tmp[randomPoisson(KeywordsLength)];
 while (Ord(c) = 0) or (Pos(c, Result) > 0) do
 c := tmp[randomPoisson(KeywordsLength)];
 Result := Result + c;
 Dec(I)
 until I = 0;
 end;
 function makePass2: string;
 var
 PassLen: integer;
 c: char;
 begin
 Result := '';
 Randomize;
 PassLen := randomPoisson(KeywordsLength shr 1);
 Writeln(PassLen);
 repeat
 c := Keywords[trunc(KeywordsLength * random) + 1];
 while (Ord(c) = 0) or (Pos(c, Result) > 0) do
 c := Keywords[trunc(KeywordsLength * random) + 1];
 Result := Result + c;
 Dec(PassLen)
 until PassLen = 0;
 end;
 begin
 // Writeln(makePass1);
 Writeln(makePass2);
 end.
Добавлено спустя 14 минут 19 секунд:
Алгоритм всегда выбирает уникальные символы из набора, т.е. повторяющихся символов нет.
Может кому пригодится, я им генерирую пароли для разных сайтов.
Keywords можно расширить, но некоторые сайты не принимают спецсимволы.



