El código (es una aplicación de consola)
delphi
program genrandom; {$APPTYPE CONSOLE} uses Windows, SysUtils; Const BUFFERSIZE = 4 * 1024; procedure WriteError(Str: AnsiString); begin FileWrite(GetStdHandle(STD_ERROR_HANDLE), PAnsiChar(Str)^, Length(Str)); end; function Min(i,j: int64): int64; begin if i<j then Result:= i else Result:= j; end; var i: Integer; l, j, k: int64; b: Byte; Buffer: PByteArray; Output: THandle; begin l:= -1; // Si le pasamos el tamaño como parametro try if ParamCount > 0 then begin l:= 1; // El tamaño es el resultado de multiplicar todos los parametros for i:= 1 to ParamCount do l:= l * StrToInt(ParamStr(i)); end; except // Si un parametro nos es valido mostramos el error On E: Exception do begin WriteError(E.Message); Halt; end; end; Randomize; // Reservamos memoria para el buffer GetMem(Buffer,BUFFERSIZE); try // Obtenemos el handle de la salida Output:= GetStdHandle(STD_OUTPUT_HANDLE); while l<>0 do begin j:= 0; // Si le pasamos un tamaño lo usamos if l > 0 then k:= Min(l,BUFFERSIZE) else // ... de lo contrario usamos todo el buffer k:= BUFFERSIZE; // Rellenamos el buffer while j < k do begin b:= Byte(Random(256)); // Solo usamos estos caracteres if AnsiChar(b) in ['A'..'Z','a'..'z','0'..'1','$','#','!'] then begin Buffer[j]:= b; inc(j); end; end; // Escribimos el buffer if j > 0 then FileWrite(Output,Buffer^,j); // Restamos del tamaño lo que llevamos escrito if l > 0 then dec(l,j); end; finally // Liberamos la memoria reservada para el buffer FreeMem(Buffer); end; end.
Posibles usos:
Generar una contraseña de 6 caracteres:
delphi
genramdom 6
Crear un archivo de 4Kb:
delphi
genrandom 4 1024 1024 > archivo.txt
Si lo ejecutas sin parámetros tu pantalla parecerá la de un hacker
delphi
genrandom
Si lo combinamos con ncat tendremos un bonito servidor de datos aleatorios:
delphi
ncat -l 5000 -k -e genrandom
... etc
Saludos