Вдохновленный вопросом в Гейл Лакманн Макдауэлл Взломать интервью по кодированию Анкет Также опубликовано на моем блог Анкет
Допустим, друг бросает вызов вам выбрать одну из двух игр на баскетбольной площадке:
- У вас есть один шанс сделать один выстрел.
- У вас есть три шанса сделать два или более выстрелов.
Вы хотите выиграть, и вы знаете точную вероятность сделать снимок P
Анкет В какой игре у вас больше шансов на победу?
Шанс выиграть игру первую
Эта игра состоит из одного шанса сделать один выстрел. Потому что вероятность сделать выстрел, как известно, является P
, шанс на победу также P
Анкет Давайте напишем это как
s_1(p) = p
где S_1 (P)
вероятность победы в первой игре.
Шанс выиграть игру второй
Здесь математика становится сложнее. Потому что ты должен сделать хотя бы Два из трех выстрелов, есть четыре способа выиграть эту игру:
🏀 | 🏀 | |
🏀 | 🏀 | |
🏀 | 🏀 | |
🏀 | 🏀 | 🏀 |
Вероятность сделать все три выстрела – это вероятность сделать первый выстрел время Сделать второй выстрел время Сделать третий выстрел, P^3
Анкет
Вероятность сделать два из трех выстрелов – это вероятность сделать два выстрела, P^2
, времена вероятность не сделать один выстрел 1 - P
Анкет Есть три шанса на это. Итак, в совокупности это 3p^2 (1 - p)
Анкет
Мы добавляем вероятность сделать все снимки до вероятности сделать два из трех и получить
s_2(p) = p^3 + 3p^2(1 - p) = 3p^2 - 2p^3
Играя в игру
Теперь пришло время решить, какую игру играть. Вероятность победы в каждой игре зависит от P
, который, как мы помним, является вероятностью сделать один выстрел. Давайте напишем немного Python, чтобы выбрать, какую игру играть в зависимости от того, что P
является.
Чтобы визуализировать функцию, давайте использовать matplotlib
и Numpy
Анкет Мы бегаем PIP установить matplotlib
и в нашем коде написать
import matplotlib.pyplot as plt import numpy as np
Затем нам нужна функция, чтобы рассчитать вероятность победы в первой игре (один выстрел). Эта функция просто вернет свой ввод, но написание его в качестве функции применит наше намерение. Мы также будем более выразительными с нашим соглашением об именах здесь, вызывая P
, single_shot_probability
и S_1
, ONE_SHOT_WIN_PROBABAILE
Анкет
def one_shot_win_probability(single_shot_probability: float) -> float: """ Calculates the probability of winning a game with one chance to make one shot from the probability of making a single shot. """ return single_shot_probability
Точно так же мы пишем функцию для расчета S_2
называется two_of_three_shot_win_probability
Анкет
def two_of_three_shot_win_probability(single_shot_probability: float) -> float: """ Calculates the probability of winning a game with three chances to make at least two shots from the probability of making a single shot. """ return 3*single_shot_probability**2 - 2*single_shot_probability**3
Теперь давайте быстро касаемся Python. two_of_three_shot_win_probability
это известное имя для функции. Иногда это уместно. Я думаю, что в сценарии, когда намерение этих функций хорошо известно всем программистам в кодовой базе, это было бы тоже подробный. Это более многословный, чем я обычно пишу, возможно, в кодовой базе в профессиональной произвольной баскетбольной компании Компания Код будет выглядеть так:
def win_2_by_3_prob(p): # Win if 2/3 shots made. return 3*p**2 - 2*p**3
Проверьте, если вам просто нужна функция для одной быстрой, вы можете написать ее как лямбда:
win2by3 = lambda p : 3*p**2 - 2*p**3
Все три способа расчета игры 2/3 делают то же самое, что является частью мастерства программирования, чтобы определить, как вы ее напишете.
Теперь, когда у нас есть функции, чтобы рассчитать вероятность победы в любой игре, мы можем построить обе функции по отношению к вероятности сделать один выстрел. Давайте изменяем эту вероятность от 0 до 1 шагов 0,01 и график с использованием matplotlib
Анкет
p_range = np.linspace(0, 1, 100) one_shot_probs = [one_shot_win_probability(p) for p in p_range] two_by_three_shot_probs = [two_of_three_shot_win_probability(p) for p in p_range] plt.plot(p_range, one_shot_probs, label="One of One to Win") plt.plot(p_range, two_by_three_shot_probs, label="Two of Three to Win") plt.ylabel("Probability of Winning Game") plt.xlabel("Probability of Making a Single Shot") plt.legend() plt.show()
В целом, мы получаем код
import matplotlib.pyplot as plt import numpy as np def one_shot_win_probability(single_shot_probability: float) -> float: """ Calculates the probability of winning a game with one chance to make one shot """ return single_shot_probability def two_of_three_shot_win_probability(single_shot_probability: float) -> float: """ Calculates the probability of winning a game with three chances to make at least two shots from the probability of making a single shot. """ return 3 * single_shot_probability ** 2 - 2 * single_shot_probability ** 3 p_range = np.linspace(0, 1, 100) one_shot_probs = [one_shot_win_probability(p) for p in p_range] two_by_three_shot_probs = [two_of_three_shot_win_probability(p) for p in p_range] plt.plot(p_range, one_shot_probs, label="One of One to Win") plt.plot(p_range, two_by_three_shot_probs, label="Two of Three to Win") plt.ylabel("Probability of Winning Game") plt.xlabel("Probability of Making a Single Shot") plt.legend() plt.show()
Запуск этого кода дает нам сюжет
Мы можем видеть, что если вероятность сделать один выстрел составляет менее 0,5, игра первой – лучший выбор. Если эта вероятность больше 0,5, игра вторая – лучшая. Если наша вероятность сделать один выстрел ровно 0,5, у нас есть такая же шанс выиграть любую игру.
Итак, в какую игру вы будете играть?
Оригинал: “https://dev.to/teckert/basketball-for-nerds-5bf0”