У меня есть массив из повторяющихся букв:Перемешать массив без создания каких-либо пробегов
AABCCD
, и я хотел бы поставить их в псевдослучайной последовательности. Простое право, просто используйте Fisher-Yates => done. Однако на выходе есть ограничение - я не хочу никаких прогонов одной и той же буквы. Я хочу, чтобы по крайней мере два других персонажа появлялись до появления того же символа. Например:
ACCABD
не действует, потому что есть два Cs рядом друг с другом.
ABCACD
также не действует, потому что есть два Кассиопеян рядом друг с другом (CAC) только один другим символом (A) между ними, я требую, по крайней мере, два других символов.
Каждый действительный последовательность для этого простого примера:
ABCADC ABCDAC ACBACD ACBADC ACBDAC ACBDCA ACDABC ACDACB ACDBAC ACDBCA ADCABC ADCBAC BACDAC BCADCA CABCAD CABCDA CABDAC CABDCA CADBAC CADBCA CADCAB CADCBA CBACDA CBADCA CDABCA CDACBA DACBAC DCABCA
Я использовал метод грубой силы для этого небольшого массива, но моей реальной проблемой являются массивы с сотнями элементов. Я пробовал использовать Fisher-Yates с некоторым подавлением - делать нормальные Fisher-Yates, а затем, если вам не нравится персонаж, который появляется, попробуйте X еще раз для лучшего. Генерирует допустимые последовательности только в 87% времени и очень медленный. Удивление, если есть лучший подход. Очевидно, это невозможно для всех массивов. Массив только «AAB» не имеет действительного порядка, поэтому я бы отказался до наилучшего доступного порядка «ABA» для чего-то подобного.
Вы должны пометить язык, в котором работаете: –
@peeskillet Тег под псевдонимом по запросу – Andrew
Если у вас есть определенный язык, с которым вы работаете, я бы пометил его только для большей экспозиции. Я только говорю, потому что у вашего сообщения было некоторое время только 11 просмотров :) –