Как вариант можно использовать HashSet - это лучше, чем брать List и постоянно его сканить.
var generatedNumbers = new HashSet<int>();
var random = new Random();
int GetRandomNumber() {
int next;
do {
next = random.Next(); // Ну или ещё min-max передавать.
} while(generatedNumbers.Contains(next))
generatedNumbers.Add(next);
return next;
}
В моём примере кода стоит ещё добавить какое-нибудь ещё условие выхода из цикла, иначе в определённый момент, когда все числа будут сгенерированы - произойдёт вечный цикл.