Tablice są numerowane od 0, a nie od 1. Musisz więc pozmieniać każdą pętlę. W pętli sprawdzającej powtórzenia powinieneś i cofać tylko o 1, a nie na wartość -1. Poza tym wygodniej byłoby Ci zapisać wylosowaną liczbę od razu do tablicy. Dodaj jeszcze jakieś ograniczenie gdy zakres jest za mały w stosunku do ograniczonych liczb (przykładowe wejście 3 5):
#include <iostream>
#include <cstdio>
#include <ctime>
#include <windows.h>
using namespace std;
int main()
{
srand(time(NULL));
int wielkosc_zbioru, ilosc_cyfr, licznik_losowan = 0;
cout << "Podaj wielkosc zbioru losowania: ";
cin >> wielkosc_zbioru;
cout << endl << "Losowanie odbedzie sie ze zbioru liczb od 1 do " << wielkosc_zbioru << endl;
cout << "Podaj ilosc losowanych cyfr: ";
cin >> ilosc_cyfr;
cout << endl;
int *tabl = new int[ilosc_cyfr];
for (int i = 0; i < ilosc_cyfr; i++)
{
tabl[i] = rand() % wielkosc_zbioru;
for (int j = 0; j < i; j++) // j < i, bo inaczej poniższy if nigdy się nie wykona
{
if (tabl[i] == tabl[j])
{
i--;
break; // gdy zostanie znalezione powtórzenie przerwij pętlę 'j'
}
}
}
for (int i = 0; i < ilosc_cyfr; i++)
{
cout << tabl[i] << endl;
}
getchar();
}