У меня 400 шаров, из которых 100 - красные, 40 - желтые, 50 - зеленые, 60 - синие, 70 - фиолетовые, 80 - черные. (шарики одного цвета идентичны)
Мне нужен эффективный алгоритм перетасовки, чтобы после перетасовки шары были в списке, а
Любые 3 последовательных шара не одного цвета. например, я не могу иметь "красный, красный, красный, желтый ...."
И все перестановки "одинаково" могут произойти. (хорошо, если компромисс между эффективностью и беспристрастностью достаточно хорош, я не против большей эффективности, чем беспристрастность).
Я пытался приспособить Фишера-Йейтса-Кнута, но результат не идеален.
Почему Фишер-Йейтс недостаточно хорош? Как FY принимает обратное преобразование Монте-Карло. А выходной дистрибутив обрабатывает одни и те же цветные шары по-разному, т. Е. Генерирует смещенный результат для моих нужд.
И наивное мышление должно было бы отфильтровывать / возвращать обратно все плохие перестановки из всего пространства. Когда ограничение очень сильное, скажем, если у нас есть только 300 шаров, из которых 100 красных, то будет слишком много отслеживания / отказов назад, прежде чем получить соответствующую перестановку.
Так что, в конечном счете, я хотел бы иметь возможность перебирать все хорошие перестановки. Тем не менее, поскольку число допустимых перестановок слишком велико, я могу только случайным образом отобрать некоторые из них.