Я знаю несколько подпрограмм, которые работают следующим образом:
X n + 1= Routine (X n, max)
Например, что-то вроде генератора LCG:
X n + 1= (a * X n + c) mod m
Недостаточно параметризации в этом генераторе для генерации каждой последовательности.
Функция мечты:
X n + 1= Routine (X n, max, номер перестановки)
Эта процедура, параметризованная индексом в множество всех перестановок, вернет следующее число в последовательности. Последовательность может быть сколь угодно большой (поэтому сохранение массива и использование факторических чисел нецелесообразно.
В противном случае у кого-нибудь есть указатели на аналогичные функции, которые либо без гражданства, либо имеют постоянное количество состояний для произвольного "max", так что они будут перебирать перетасованный список.