Очень удобно писать с точки зрения типизации. Раньше тоже не понимал. Это надо прочувствовать. Потом есть что то подобие web pack, тоже удобно юзать через namespace
Сделайте переменную типа lastOpenElement. При открытие текущего проверяйте не null ли он, если не null, то close (hidden) ну или что там у вас, и присваивайте этой переменной текущий элемент
Запускаете рекурсию, каждый раз берете рандом от остатка предыдущего рандома , начальное рандомное число будет в пределах вашей суммы , можно исключить 0 ( решение в лоб, как вариант)