Если я правильно вас понимаю, тогда эти мысли должны сработать для вас:
Есть 7! = 5040
возможных способов упорядочить ваши элементы.Из этих 5040
уникальных последовательностей 6! = 720
имеют k1
в первой позиции, 720
имеют k2
в первой позиции, ..., 720
имеют k1
впоследняя позиция ... и так далее.Итак, если вы случайным образом извлекаете 30
из этих 5040
последовательностей, я думаю, что результат должен соответствовать вашим требованиям.
Как их нарисовать?Ну, это зависит от языка программирования, который вы используете.В C ++ есть next_permutation
.В питоне есть itertools.permutations
.Эти функции будут перебирать все возможные варианты 7!
в лексикографическом порядке.Другие языки могут предлагать аналогичные инструменты.
Затем вы можете случайным образом сгенерировать число n
в [0, ..., 5040[
и вызвать next_permutation
n
раз в начальном диапазоне (или, в python, продвинуть итераторn
раз).Повторите это 30 раз.Однако обратите внимание, что для большего числа это может быстро стать очень неэффективным, не зная, что ваши потребности касаются эффективности.
Обновление
Чем больше я думаю о своем решении, тем больше я понимаю, что Как их нарисовать? можно ответить гораздо лучше:
Все, что вам нужно - это алгоритм равномерного перемешивания .Это, по определению, сгенерирует одну из 7!
перестановок, что в точности соответствует моему первоначальному ответу, но это будет намного эффективнее и намного проще для кодирования, так как большинство языков предоставляют такой алгоритм перемешивания (например, C ++ * 1041).*).
Я сохраню свой первоначальный ответ, потому что он помогает мне (и, надеюсь, другим) понять, почему равномерное перемешивание является правильным решением здесь.