Oltre a quello che ha detto Xaratroom, personalmente la trovo proprio assurda!

Domanda: è solo un esercizio o dovrebbe avere un uso pratico?

In ogni caso:

così come l'hai scritta, SetRange e GetRange avrebbero senso se fossero pubbliche, non private. Puoi usare direttamente le variabili a prescindere dalla visibilità delle funzioni.

In genere poi è meglio settare le variabili nella lista del costruttore.

codice:
Gen::Gen(int c, int s) : range(c) , seed(s) 
{
//    seed = s;
//    SetRange(c);  /* qui è inutile a prescindere se pubblica o privata */
    srand(seed);
}
Poi allochi un puntatore *list e non metti un costruttore di copia per evitare che venga compiuta una delete due volte al termine dello scope di chiamata.

codice:
Gen a(10, 10);
Gen b = a; // copia bit a bit. Alla fine *list viene distrutto due volte
Infine la *GetList();
codice:
Gen a(10,20);

int* result = a.GetList(50);
delete result; //  <-- chi dice che un int* sia un array?
E poi ogni chiamata a GetList alloca memoria che non verrà liberata che nel distruttore.
codice:
int *Gen::GetList(int n)
{
    list =  new int[n];   // <-- errore!!!
    for(int i=0; i < n; i++)
    {
        list[i] = gen_casual();
    }
    return list;
}
.....................

Gen a(10,20);

int* result = a.GetList(50);
int* result1 = a.GetList(30);
int* result2 = a.GetList(5);
int* result3 = a.GetList(56);
Quattro allocazioni e solo una distruzione (forse)
per evitare sto spreco basta fare

codice:
std::vector<int> Gen::GetList(int n)
{

    std::vector<int> v(n);
    for(int i=0; i < n; i++)
    {
        v[i] = gen_casual();
    }

    return v;
}
e non si hanno memory leak.