Думайте о своем исходном диапазоне, чтобы выбрать из списка 1-n, когда вы выбираете элемент (число), удаляйте этот элемент из списка. Выберите элементы на основе индекса списка, а не фактического числового значения.
int Choose1(List<int> elts)
{
var idx = rnd.Next(0,elts.Count);
var elt = elts[idx];
elts.RemoveAt(idx);
return elt;
}
public List<int> Choose(int fromN, int chooseM)
{
var range = new List<int>();
for (int i = 1; i <= fromN; i++)
{
range.Add(i);
}
var choices = new List<int>();
for (int i = 0; i < chooseM; i++)
{
choices.Add(Choose1(range));
}
return choices;
}
Использование списков не будет эффективно для больших чисел, но вы можете использовать тот же подход, фактически не создавая списки, используя немного арифметики.