sábado, 8 de junio de 2019

Mezclar un string.

Es decir, un random de una cadena de caracteres. Lo publico porque luego de hacer esta función se me ocurrió buscar en Internet cómo lo habían resuelto otros colegas o sí ya existía una función para tal fin. Pues resulta que no, sí lo hay para stringlist, pero eso es otra cosa. Si bien podría optimizarse un poco más, por tratarse de una función chica, creo que así está bien. Podría evitarse la variable q por ejemplo y el SetLength del array hacerlo en base Length(cl).
En definitiva esta función recibe un string y devuelve un string con los mismos caracteres pero cambiados de lugar, por ejemplo puede recibir "casa" y retornar "aacs".

function Mezclar(const cl: string): String;
var
  i,j,rand,indarray,q:Integer;
  res:String;
  aInd:array of Integer;
  yaesta:Boolean;
begin
  q:=Length(cl);
  yaesta:=False;
  SetLength(aInd,q);
  res:='';
  i:=Length(cl);
  indarray:=0;
  repeat
    rand:=Random(q)+1;
    for j:=Low(aInd) to High(aInd) do
      if aInd[j]=rand then yaesta:=True;
    if not(yaesta) then
      begin
        res:=res+cl[rand];
        aInd[indarray]:=rand;
        Inc(indarray);
        Dec(i);
      end;
    yaesta:=False;
  until i=0;
  Result:=res;
end;


Para los novatos o quienes están medios oxidados o retornando a la programación, puede ser un interesante ejercicio.

¿Qué me llevó a hacer esta función? Un programa de generación de contraseñas, del tipo que le permite al usuario especificar la cantidad de mayúsculas, minúsculas, números y caracteres especiales (símbolos), en una parte tenía los randoms de esta forma "GYEBkfuenlow4982($*!" entonces eso se lo paso a esta función y listo, me altera las posiciones, sería un random de un random "ordenado" o algo así.

Aclaración: Randomize lo llamo en el Form.Create por eso no está en la función. Se recomienda utilizar Randomize solo una vez.

No hay comentarios:

Publicar un comentario