Funkcja rand() w C++ zwraca pseudolosową liczbę całkowitą z przedziału [0, RAND_MAX]. Aby "ściąć" ten duży zakres do żądanego, często stosuje się operator % (modulo), który zwraca resztę z dzielenia.
Dla dzielnika (a+1) możliwe reszty to zawsze wartości od 0 do a włącznie. Dlatego wyrażenie rand() % (a + 1) generuje liczbę naturalną dokładnie z zakresu [0, a] (przedział domknięty, zawiera oba końce).
Pozostałe odpowiedzi są błędne z powodu nieprawidłowego zakresu:
- a + rand() % (a + 1) – część z modulo daje 0..a, ale dodanie a przesuwa wyniki na [a, 2a], więc nie ma wartości mniejszych niż a.
- a + rand() % a – modulo a daje 0..a−1 (dla a>0), a po dodaniu a otrzymujemy [a, 2a−1], nadal bez 0..a−1.
- rand() % a – daje [0, a−1], czyli brakuje wartości a, wymaganej przez zapis [0,a].
Wskazówka egzaminacyjna: jeśli w treści jest zakres "do a włącznie", w wyrażeniu z modulo zwykle pojawia się (a+1). Dodatkowo w praktyce dla zmiennych sekwencji losowej często inicjalizuje się generator (np. przez srand), a w nowoczesnym C++ preferuje się bibliotekę <random>, ale to nie zmienia poprawności samego mapowania przez modulo.