FAQ » Algorytmy

Jak wylosować stringa

  • 2011-05-19 09:32
  • 8 komentarzy
  • 1057 odsłon
  • Oceń ten tekst jako pierwszy
Zmienne:
LLength     - Integer/Byte - Długość losowanego ciągu znaków (String'a)
AreBig      - Boolean      - Czy w haśle mają być duże litery
AreSmall    - Boolean      - Czy mają być małe litery
AreDigits   - Boolean      - Czy mają być cyfry
AreSpecials - Boolean      - Czy mają być znaki specjalne !@# etc.
AreOwn      - Boolean      - Czy mają być wybrane samemu(np. niedrukowalne)
Own         - String       - Zawierające znaki, które będą miały być dodane jeżeli AreOwn = True
Chars       - String       - Znaki do losowania
Password    - String       - Wylosowane hasło
I           - Integer      - Licznik

Function GenerateString(AreBig, AreSmall, AreDigits, AreSpecials, AreOwn: Boolean; Own: String): String; 
Var
  Chars   : String;
  Password: String;
  I       : Integer;
Begin;
  Chars    := '';
  Password := '';
  If AreBig Then
    Chars := Chars + 'QWERTYUIOPASDFGHJKLZXCVBNM';
  If AreSmall Then
    Chars := Chars + 'qwertyuioplkjhgfdsazxcvbnm';
  If AreDigits Then
    Chars := Chars + '123456789';
  If AreSpecial Then
    Chars := Chars + '!@#$%^&*()_-+=[]{};\\:"|,./<>?''';
  If AreOwn Then
    Chars := Chars + Own;
  Randomize;
  For I := 1 To LLength Do
    Password := Password + Chars[Random(Length(Chars))+1];
  Result := Password;
End;

8 komentarzy

Henryk555 2011-07-31 22:36

  // Można chyba i tak .....  
    private
    { Private declarations }
    Lista : TStringList;
    function Fraza : String;
    function Losuj(sl : TStringList) : String;
  public
    { Public declarations }
      function Wylosowany_string : String;
  end;


function TForm1.Losuj(sl : TStringList) : String;
begin
  Result := sl.Strings[Random(sl.Count)];
end;

function TForm1.Fraza : String;
begin
  Result := Losuj(Lista);
end;

function TForm1.Wylosowany_string : String;
begin
  case Random(1) of
    0: Result := +Fraza +;
  end;

end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
  Lista:= TStringList.Create;
  Lista.LoadFromFile('Stringi.txt');

//Przykładowo czytanie z pliku co nie jest jedynym rozwiązaniem :)


procedure TForm1.FormDestroy(Sender: TObject);
begin
Lista.Free; //Zwolnienie pamieci !!!!!! (ważne}

end;


//Wywołanie procedury losującej
procedure TForm1.SpeedButton1Click(Sender: TObject);
with Label1 do
Label6.Caption:=(Wylosowany_string);
end;

masterO 2011-05-16 13:07

Idealny przykład jak nie należy pisać algorytmu, który nie może być w 100% prawidłowy za każdym razem. To tak jakby lecieć samolotem i liczyć na to, że tym razem wysokościomierz pokaże prawidłową wysokość. :D

macieksty 2005-01-23 21:26

podany powyżej przykład nie jest najlepszym rozwiązaniem... dlaczego? wszystkie znaki zostają wpisane do jednego łańcucha co nie daje nam gwarancji że wylosowane znaki będą zawierały te które chcieliśmy wylosować. Np. Załóżmy że chcemy wylosować łańcuch o 8 znakach oraz bedzie zaiwerał małe, wielkie litery, cyfry i znaki specjalne. I tu nadchodzi rozczarowanie, gdyż przy co 3 losowaniu okazuje się że brakuje jakiegoś znaku...
Pomysł na pierwszy rzut oka ciekawy ale praktycznie wykazuje duże błędy...

tdobe 2004-07-22 09:41

Witam.

Ps. Procedury Randomize nie umieszcza się w pętli, wystarczy raz ją wywałć w programie, ewentualnie raz na początku procedury losującej

AklimX 2004-07-12 19:07

bardzo prosty mechanizm, ale może komuś się przyda :)

wasyl 2004-07-08 21:00

LF: Wiem :D Jakos tak mi sie napisalo :P

ŁF 2004-07-08 20:57

losowanie losowego stringa... lol