генерация случайных перестановок и комбинаций (python 3.x) - PullRequest
1 голос
/ 01 мая 2020

У меня есть код для расчета количества комбинаций или перестановок для любого данного набора.

(math.comb (n, k)) и (math.perm (n, k)), так что perm = (math.perm (10,5)), perm == 30240 перестановок

Я хотел бы генерировать случайные перестановки и комбинации n и k,
, поэтому, если n = 10 и k = 5, я бы получил что-то вроде 3,7,1,2,9 в виде завивки или расчески.

Какую математическую функцию я бы использовал для этого?

Редактировать:
Код должен сгенерировать массив из k значений из 10 случайных выборок, а для комбинаций удалить каждое значение (k ), поскольку он выбран из основного набора (n), поэтому нет повторений (n). Ветвь математики - комбинаторика (если это помогает)
Я уверен, что для этого уже должна быть функция.
У меня есть миллионы массивов для генерации и обработки.

1 Ответ

0 голосов
/ 11 мая 2020

Вы можете использовать random модуль Python, который предварительно включен как math (поэтому вам не нужно устанавливать его, используя pip et c.). Сначала определите набор, из которого вы хотите выбрать k элементов случайным образом, в вашем примере это набор целых чисел от 1 до 10, поэтому я использую S=[i for i in range(1,11)] (помните, что последний элемент в диапазоне - это элемент перед целым числом, которое вы даете это как окончание диапазона). Затем для получения k элементов с заменой используйте команду choices в пакете random, а для случая без замены используйте команду sample. Коды приведены ниже.

import random
S=[i for i in range(1,11)]
A=random.choices(S,k=5)
B=random.sample(S,5)

Например, когда я запустил вышеуказанный код после запроса python показать мне S, A и B соответственно, я получил следующий результат.

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[8, 3, 2, 6, 8]
[3, 9, 6, 1, 10]

Вы также можете использовать модуль numpy, чтобы объединить два этапа определения S с диапазоном, а затем использовать numpy.random.choice. Но обратите внимание, что у вас будет k вариантов из набора из 10 целых чисел, начинающегося с 0, а не 1. Чтобы выбрать из набора, не определенного как n целых чисел сиквела, начиная с 0, вы должны определить его снова так же, как наш первый метод, и дать ему к этой команде вместо только числа, такого как 10. Чтобы сделать выбор, который будет сделан без замены, вы должны добавить опцию replace=False. См. Следующий код.

import numpy
C=numpy.random.choice(10,5)
D=numpy.random.choice(10,5,replace=False)
S=[i for i in range(1,11)]
A=numpy.random.choice(S,5)
B=numpy.random.choice(S,5,replace=False)

После выполнения этого и запроса наборов C, D, A и B соответственно я получил следующее.

array([5, 5, 1, 4, 7])
array([0, 7, 4, 6, 1])
array([10,  5,  7,  1,  7])
array([6, 5, 7, 8, 1])
...