С логической точки зрения это возможно. Учитывая список n песен, существует n! перестановок; если вы присваиваете каждой перестановке число от 1 до n! (или от 0 до n! -1 :-D) и выбираете одно из этих чисел случайным образом, вы можете сохранить номер перестановки, которую вы используете в данный момент, вместе с исходным списком и индексом текущей песни внутри перестановки.
Например, если у вас есть список песен {1, 2, 3}, ваши перестановки:
0: {1, 2, 3}
1: {1, 3, 2}
2: {2, 1, 3}
3: {2, 3, 1}
4: {3, 1, 2}
5: {3, 2, 1}
Таким образом, единственные данные, которые мне нужно отслеживать, - это исходный список ({1, 2, 3}), индекс текущей песни (например, 1) и индекс перестановки (например, 3). Затем, если я хочу найти следующую песню для воспроизведения, я знаю, что это третья (2, но с нуля) песня перестановки 3, например, Песня 1.
Однако этот метод основан на том, что у вас есть эффективные средства для определения i -ой песни из j -ой перестановки, о которой, пока у меня не было возможности подумать с более сильным математическим фоном, чем я могу вставить) эквивалентно «тогда происходит чудо». Но принцип есть.