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