Losowanie znaków z tablicy ASCII

Losowanie znaków z tablicy ASCII
HF
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 4 lata
0

Witam,

Po dłuższej przerwie postanowiłem przypomnieć sobie C++.

Napisałem taką oto funkcję, która losuje mi znaki nie-alfanumeryczne (mam tu na myśli ! @ # $ itp.). Funkcja działa jak najbardziej prawidłowo, ale czy da się to zrobić lepiej? W bardziej elegancki sposób?

Kopiuj
 char GetRandomChar()
{
    char array[] = {'!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/',
                    ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '~'};

    return array[rand() % sizeof(array)];
}
wujnia
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:161
1

C++ ma swoje funkcje losowe. Nawet w C rand jest trochę prehistorią.

fasadin
wypadaloby bys podal przyklad. Skad autor ma wiedziec o czym Ty piszesz?
wujnia
Może poszukać np. w google. Dlaczego Kolega z góry założył, że autor jest niepełnosprawny umysłowo?
several
Goole zaindeksuje sobie ten wątek. Teraz gdy ktoś tu trafi z google'a dostanie w zamian Twoją radę żeby poszukać sobie w google.
wujnia
Nie uroniłem, łzy.
bl4ster
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Lublin
  • Postów:197
0

Przede wszystkim nie wymieniłeś wszystkich znaków w tablicy. Gdybym chciał to zrobić w ten sposób jak to przedstawiłeś, to raczej wymieniłbym nie znaki, tylko liczby reprezentujące je (patrz tablica ASCII), czyli np dla '!', '"', '#', '$', '%', '&', ''', '(', ')', '*', '+', ',', '-', '.', '/' to są znaki od numerach od 33 do 47.
Wtedy łatwo taką tablicę wypełnić.

Co do samego losowania, to jak kolega wcześniej napisał jest nowsza funkcja: http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution


"Jesteśmy świadomymi istotami, a życie jest sposobem w jaki wszechświat poznaje sam siebie." prof. Brian Cox
carlosmay
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Pabianice
0

Losowanie liczby z przedziału całkowicie zwalnia z tworzenia tablicy. Zamiast indeksu losujesz konkretną wartość z tabeli ascii i masz wylosowany znak. Castujesz zwracaną wartość na char i gotowe.


kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Szczecin
5

Losowanie przedzialu zamyka Cię w ASCII. Dodatkowo wymusza korzystanie z magic numbers. Ja bym raczej zrobił coś takiego:

Kopiuj
thread_local std::mt19937 prng{std::random_device{}()};

char GetRandomChar()
{
	static constexpr char chars[] = R"X(!"#$%&'()*+,-./:;<=>?@[\]^_~)X";
	return chars[std::uniform_int_distribution<int>(0, sizeof(chars) - 2)(prng)];
}

http://melpon.org/wandbox/permlink/h1HAXnXRf7JxWES1


edytowany 2x, ostatnio: kq
several
Gdybym mógł, dałbym więcej niż +1.
bl4ster
@HydeFromT70s pamiętaj, że char to właściwie int :D btw @kq bardzo dobre rozwiązanie.
Azarien
ja tu nadal widzę magic number 19937 ;-)
HF
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 4 lata
0

Dzięki wszystkim za odpowiedzi. Muszę poczytać o tej nowej metodzie losowania bo nie znałem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.