INF.04 · pytanie 441
Zademonstrowana pętla wykorzystuje obiekt random do: var random = new Random(); String pulaZnakow = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ"; int dlPuli = pulaZnakow.Length - 1; char znak; string wynik = ""; for (int i = 0; i < 8; i++) { znak = pulaZnakow[random.Next(0, dlPuli)]; wynik += znak; }
- Astworzenia losowego napisu o długości 8 znaków składającego się z literPoprawna
- Bjednorazowego wylosowania znaku z określonego zestawu znaków
- Cuzupełniania tablicy danymi w postaci liczb pseudolosowych
- Dwielokrotnego generowania liczby, aby stworzyć ciąg z liczb pseudolosowych
Wyjaśnienie
Ta odpowiedź dobrze opisuje działanie całego fragmentu kodu: pętla wykonuje się 8 razy i za każdym razem losuje jeden indeks z zakresu dostępnych pozycji w zmiennej pulaZnakow. Następnie pobiera znak spod tego indeksu i dokleja go do zmiennej wynik. Efektem jest więc losowy napis o długości 8 znaków, zbudowany z liter znajdujących się w przygotowanej puli. To typowy mechanizm używany np. do tworzenia prostych kodów promocyjnych, tymczasowych identyfikatorów, nazw plików albo krótkich losowych etykiet w aplikacji. Warto zauważyć detal z C#: Random.Next(min, max) nie uwzględnia wartości max, więc przy dlPuli = pulaZnakow.Length - 1 ostatni znak z puli w praktyce nie będzie losowany. Poprawniej byłoby użyć Random.Next(0, pulaZnakow.Length). Z mojego doświadczenia to częsty błąd typu off-by-one. Dobrą praktyką przy składaniu dłuższych napisów w pętli jest też użycie StringBuilder zamiast ciągłego wynik += znak, bo stringi są niemutowalne. Jeśli taki napis miałby być hasłem, tokenem resetowania hasła albo kluczem bezpieczeństwa, zwykły Random nie wystarcza — wtedy używa się generatorów kryptograficznych, np. RandomNumberGenerator.