Как расположить k элементов N способами с равной вероятностью

#combinations #permutation #probability

#комбинации #перестановка #вероятность

Вопрос:

У меня есть 7 элементов, k1-k7, и я хочу расположить их 30 различными способами, чтобы каждый элемент появлялся в каждой позиции с равной вероятностью.

 k1, k2, k3, k4, k5, k6, k7

k1, k4, k5, k3, k7, k6, k2

.

k6, k2, k7, k1, k5, k4, k3
  

Я не могу понять, какой метод для достижения этого. Пожалуйста, дайте мне знать, какой алгоритм будет работать здесь.

Ответ №1:

Если я вас правильно понимаю, то эти мысли должны сработать для вас:

Есть 7! = 5040 возможные способы упорядочить ваши элементы. Из этих 5040 уникальных последовательностей есть 6! = 720 такие, которые имеют k1 первую позицию, 720 имеют k2 первую позицию, …, 720 имеют k1 последнюю позицию, … и так далее. Итак, если вы случайным образом рисуете 30 из этих 5040 последовательностей, я думаю, результат должен соответствовать вашим требованиям.

Как их нарисовать? Ну, это зависит от используемого вами языка программирования. В C есть next_permutation . В Python есть itertools.permutations . Эти функции будут перебирать все 7! возможные расположения в лексикографическом порядке. Другие языки могут предлагать аналогичные инструменты.

Затем вы можете случайным образом сгенерировать число n в [0, ..., 5040[ и вызвать next_permutation n время в начальном диапазоне (или, в python, увеличить время итератора n ). Повторите это 30 раз. Однако обратите внимание, что для большего числа это может быстро стать очень неэффективным, не уверен, каковы ваши потребности в отношении эффективности.

Обновить

Чем больше я думаю о своем решении, тем больше я понимаю, что как их нарисовать? можно ответить намного лучше:

Все, что вам нужно, это единообразный алгоритм перетасовки. Это по определению будет равномерно генерировать одну из 7! перестановок, что в точности соответствует моему первоначальному ответу, но это будет намного эффективнее и намного проще в кодировании, поскольку большинство языков предоставляют такой алгоритм перетасовки (например, C ).

Я сохраню свой первоначальный ответ, потому что это помогает мне (и, надеюсь, другим) понять, почему равномерная перетасовка является правильным решением здесь.

Комментарии:

1. Спасибо, это то, что я искал 🙂

2. @RudreshaParameshappa рад это слышать 🙂 пожалуйста, прочитайте мое обновление

Ответ №2:

Моей первой попыткой было бы взять один случайный элемент из списка, затем взять случайный элемент из подмножества не выбранных элементов и так далее. Для второго подмножества сделайте то же самое, и когда закончите, проверьте, равно ли оно первому подмножеству. Из-за равномерного распределения хорошей случайной функции это должно дать вам равные вероятности

Ответ №3:

Вы не можете, по крайней мере, не так, как указано в описании. Если k_1 должна была быть одинаковая вероятность появления в каждой позиции, то количество комбинаций, в которых он появился в позиции 1, было бы равно количеству комбинаций, в которых он появился в каждой из других позиций. Но это означает, что количество комбинаций должно быть кратно 7, а 30 — нет.

Если вас интересует вероятность только при розыгрыше 30 комбинаций, то, как предлагает Бруени, можно выбрать последовательность случайным образом. Однако это не имеет никакого отношения к наличию 30 комбинаций, поэтому я сомневаюсь, что это то, что вы намереваетесь?

Комментарии:

1. Есть два разных способа взглянуть на это: если у вас есть 10 чисел, и вы не знаете их значений, вы просто знаете, что они были «созданы» путем броска кости, тогда вы все равно знаете, что каждое число от 1 до 6 имеет равную вероятность ( 1/6 ) появления в каждой позиции (даже если 10 не кратно 6), потому что вы знаете, что для каждой позиции кости были брошены. Однако это меняется, если вы дополнительно знаете , что кости бросили 3 единицы. Тогда вероятность наличия единицы в определенной позиции, конечно 3/10 .