В операторе по модулю вы должны использовать длину интервала, в котором вы хотите получить значения.
rand_num=rand()%(90-47)+47;
Как упоминалось Джеспером, это вводит смещение.Чтобы понять это, подумайте, что произойдет, если вам нужно число, равное 0 или 1, а диапазон рандов равен [0, 1, 2].С помощью приведенной выше формулы вероятность получения 0 будет 0,66, а вероятность получения 1 будет 0,33).
Чтобы преодолеть эту проблему, вы можете использовать следующую формулу, которая масштабирует случайное число доплавать в интервале [0,1], а затем использовать его для генерации нужного вам числа.
(double) uniform = (double) rand() / (double) RAND_MAX;
rand_num = (int) ((90.0 - 47.0)*uniform) + 47);