Рубрики
Без рубрики

Баскетбол для ботаников

В какую игру вы будете играть?. Помечено математикой, вероятностью, интервьюированием, Python.

Вдохновленный вопросом в Гейл Лакманн Макдауэлл Взломать интервью по кодированию Анкет Также опубликовано на моем блог Анкет

Допустим, друг бросает вызов вам выбрать одну из двух игр на баскетбольной площадке:

  1. У вас есть один шанс сделать один выстрел.
  2. У вас есть три шанса сделать два или более выстрелов.

Вы хотите выиграть, и вы знаете точную вероятность сделать снимок 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”