Используя случайную перетасовку, вы будете иметь массивное количество итераций, которые в итоге не добавят новый элемент в набор - вы должны искать подход, который гарантирует, что на каждом итерация: новый элемент помещается в набор (под «новым» я подразумеваю перестановку, которая ранее не была видна).
Мне бы не хотелось догадываться, насколько сложен алгоритм, представленный выше, - он будет большим.