Возможность повторов заложена в самой природе случайности. Ты ведь можешь монетку подбросить двумя решками кверху подряд.
Придётся ручками проверять, было ли уже такое значение или нет.
Вообще, лучше сделай так:
1. Сгенери набор чисел A[0...N], из которых надо будет вытянуть случайным образом значения
2. Получи случайное число R, такое чтобы 0 <= R <= A[N-1]
3. Получи элемент набора A[R] и выброси этот элемент из него. В наборе останется N-1 элементов
4. GOTO 2 пока набор не пустой
Как с набором карт, из которой ты по одной тянешь карты. То есть, случайно ты определяешь не само число, а порядковый номер числа в некоем наборе.
static void Main()
{
List<int> cards = new List<int>(); // колода
for (int i = 0; i < 54; ++i) cards.Add(i); // заполняем от 0 до 53
var rng = new Random();
while(cards.Count >0)
{
var r = rng.Next(cards.Count); // случайное число
Console.Write(cards[r] + ","); // смотрим карту
cards.RemoveAt(r); // убираем карту из колоды
}
Console.ReadLine();
}