Te voy a dejar un truquito para no tener que poner ese tremendo while() con todas las condiciones de los aleatorios. Eso podría dejar el programa ahí indefinidamente.
int num = rand()%(MAX-MIN+1)+MIN;
Eso genera un valor entre MAX y MIN, ambos incluídos.
El operador
% devuelve el resto de una división. Poner rand()%num va a devolver un número que será el resto de rand()/num. El resto va desde 0 hasta num-1, eso ya son matemáticas.
Lo de mínimo ya solo es un arreglo matemático de fácil comprensión.
Suerte. Si implementas eso, y revisas el código, quizás te vaya.