Забавный метод, одобряю. Только ты пользуешься "магической формулой" без ее понимания, вот и выходит чушь. rand() возвращает число от 0 до RAND_MAX. Операция остатка (%) возвращает числа от 0 до делителя (не включая), т. е. X%Y будет в диапазоне от 0 до Y-1. Тебе нужно число из диапазона minNum..maxNum. Для того, чтобы получить его из числа от 0 до Y-1, нужно увеличить это число на minNum, тогда 0+minNum станет minNum, а Y-1+minNum станет maxNum. Отсюда легко получить Y=maxNum-minNum+1. Итак, твоя формула rand()%(maxNum-minNum+1)+minNum.