Вы правы в том, что насчитывается 18 счетных чисел от -9 до 9 (включительно).
Но компьютер использует целые числа (набор Z), который включает ноль, что делает его 19 числами.
Минимальное соотношение, которое вы получаете от rand () к RAND_MAX, равно 0, поэтому вам нужно вычесть 9, чтобы получить -9.
Информация ниже не рекомендуется. Это не в manpages aymore. Я также рекомендую использовать modern C ++ для этой задачи.
Также, man-страница для функции rand цитаты:
"Если вы хотите сгенерировать случайное целое число от 1 до 10, вы всегда должны делать это, используя старшие биты, как в
j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
и никогда ничем не напоминающим
j = 1 + (rand() % 10);
(который использует младшие биты). "
Так что в вашем случае это будет:
int n= -9+ int((2* 9+ 1)* 1.* rand()/ (RAND_MAX+ 1.));