Jak wylosować stringa

wasyl

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

// 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;

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

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...

Witam.

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

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

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

losowanie losowego stringa... lol