Losowanie znaków z tablicy ASCII

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?

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

    return array[rand() % sizeof(array)];
}
1

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

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

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.

5

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

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

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1