Найти тему
Nuances of programming

Вероятность в Python: перестановки и сочетания

Источник: Nuances of Programming

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

Быстрый поиск в Google выявляет 4 основные математические темы, на которых основана вся область:

  • Линейная алгебра
  • Анализ
  • Статистика
  • Вероятность

Сегодня я расскажу о двух важнейших концепциях из теории вероятности: сочетаниях и перестановках

Начнем с базового определения самой вероятности: 

Вероятность — степень (относительная мера, количественная оценка) возможности наступления некоторого события. В теории вероятностей вероятность принимает значения от 0 до 1. Значение 1 соответствует достоверному событию, невозможное событие имеет вероятность 0. Чем выше значение, тем больше вероятность события.

Вероятность как область научного знания важна, потому что неопределенность и случайность встречаются повсеместно, соответственно, знание о вероятности помогает принимать более информированные решения и осмыслять неопределенности. 

Перед погружением в перестановки и сочетания, нужно понять еще один термин — факториал

Что такое факториал? 

Хороший вопрос. Согласно Википедии: 

Факториал — функция, определённая на множестве неотрицательных целых чисел. Факториал натурального числа n определяется как произведение всех натуральных чисел от 1 до n включительно.

Факториал вычисляется по следующей формуле: 

-2

Вот пример:

-3

Теперь вы, возможно, задумались, как вычислять факториалы в Python. Во многих библиотеках есть готовые функции, но создать собственную функцию тоже очень легко, и именно это мы и сделаем. 

Вот простая рекурсивная функция, которая справится с задачей: 

-4

Теперь можно использовать эту функцию для проверки примера выше: 

-5

Хорошо, но где факториалы используются в реальном мире? 

Скажем, в гонке участвуют пять человек, и вы хотите узнать количество способов, по которым эти пятеро могут финишировать первыми, вторыми или третьими. Можно взять листок бумаги и просто записать все возможные варианты, но зачем? Что если участников 100? 

Вот как эта задача решается с помощью факториалов: 

-6

Это называется перестановка

Перестановки

И снова начнем с определения: 

В математике перестановка — это упорядочение членов набора в последовательность или, если последовательность уже определена, перестановка (изменение порядка) ее элементов. 

Существует два способа вычисления перестановок. Выбор способа зависит от того, разрешается повторение или нет. Давайте рассмотрим на примере.

У вас есть веб-сайт, на котором могут регистрироваться пользователи. Им нужно вводить пароль длиной строго в 8 символов, которые не должны повторяться. Сперва нужно определить, сколько букв и цифр в английском алфавите:

  • количество букв: 26
  • количество цифр: 10

То есть всего 36. Тогда n = 36, а r = 8, потому что пароль должен быть длиной в 8 символов. Зная это, мы легко можем рассчитать количество уникальных паролей, используя формулу: 

-7

Если вы поспешили и посчитали вручную: 

-8

В Python это тривиальная задача:

-9

Здорово, но я хочу разрешить пользователям повторно использовать символы. Нет проблем, в данном случае это перестановки с повторениями, формула еще проще: 

-10

Мы уже знаем, что n (36) и r (8), так что вот решение:

-11

И снова реализация на Python тривиальна:

-12

Это действительно большое число. Попробуйте произнести его вслух! 

Сочетания

Далее на повестке дня — сочетания. Вам наверняка любопытно, что это такое и в чем их отличие от перестановок. Начнем с определения: 

Сочетание— это выбор значений из набора, в котором (в отличие от перестановок) порядок выбора не имеет значения. 

Чтобы понять это определение, разберем следующий пример: группа людей, выбранных в команду — это та же самая группа, независимо от порядка участников. Вот и вся идея сочетаний. Если выбрать 5 членов команды, можно упорядочить их по имени, росту или другому параметру, но команда останется прежней — порядок не имеет значения. 

Давайте запишем это формулой. Количество сочетаний C набора из n объектов, взятых по r, рассчитывается так:

-13

С этим уравнением мы можем решить следующую задачу: сколькими способами можно выбрать в футбольную команду 5 человек из 10? 

Группа будет той же, порядок значения не имеет. Значит, n = 10, а r = 5:

-14

И это можно легко сделано в Python:

-15

Великолепно! Но интересно, существует ли версия сочетаний с повторениями? Да! 

Представьте, что готовите сэндвич и по какой-то причине вам нужно использовать только 4 ингредиента из 10. Однако ингредиенты не должны быть уникальны, например, можно положить 3 куска сыра и 1 кусок салями. Как это здорово, я тоже обожаю сыр, вот спасибо!

Но как сформулировать эту идею математически? Ответ снова прост:

-16

Давайте применим формулу к примеру выше. n снова равно 10 (потому что 10 возможных ингредиентов), а r = 4 (потому что выбрать можно только 4):

-17

Используем Python для проверки:

-18

 Превосходно. 

И напоследок 

Сочетания и перестановки математически просты, однако сложность заключается в том, как представить в такой форме реальные проблемы. Иногда бывает трудно выделить значения n и r в повседневной жизни. Я не могу решить для вас подобные задачи, но надеюсь, что данная статья поможет вам разобраться. 

Читайте также:

Читайте нас в телеграмме и vk

Перевод статьи Dario Radečić: Essential Probability in Python: Permutations and Combinations