Как сделать шанс в python?
Наверно плохо читал документацию но так и не нашёл, как сделать шансы выпадения чисел в python ?
Например что бы число 5 выпадало с 80% вероятностью, а число 7 с 20%
- Вопрос задан более двух лет назад
- 3763 просмотра
Комментировать
Решения вопроса 3

soremix @SoreMix Куратор тега Python
random.choices([5,7], weights=[80,20], k=1)[0]
Либо нечто похожее через cum_weights
random.choices([5,7], cum_weights=[0.8, 1.0], k=1)[0]
Ответ написан более двух лет назад
Нравится 6 1 комментарий
import random w = 0 for _ in range(100): if random.choices([5,7], cum_weights=[0.8, 1.0], k=1)[0] == 5: w += 1 print(w)
Шансы в языке Python
Я вроде приспособился писать вот такой код для случайного выпадения одного из вариантов (50 на 50):
import random
val=random.randint(1,2)
if val==1:
print(1)
if val==2:
print(2)
Но может есть какой-то способ сделать это короче?
Может даже указать в процентах?
Голосование за лучший ответ
А print(val) не судьба?)
CulasvisУченик (86) 5 лет назад
Не понял вас: зачем print(val), причем он тут?
Лайт Ягами Искусственный Интеллект (272943) Притом, что плодить на каждый кейс отдельную обработку — глупо) Кроме случаев, когда они действительно должны обрабатываться по-разному, но в вашем примере — всё выводится на экран)
if random.randrange(2):
первое действие
else:
второе действие
если вариантов больше двух и они с разными вероятностями, проще сделать так
import bisect
import itertools
p = list(itertools.accumulate([0.1, 0.3, 0.45]))
n = bisect.bisect(p, random.random())
if n == 0:
действие которое выполнится в 10% случаев
elif n == 1:
в 30% случаев
elif n == 2:
в 45% случаев
else:
в оставшихся 15% случаев (100% — 10% — 30% — 45% = 15%)
Используем цикл for для вычисления вероятностей
Перевод статьи «Using For Loops in Python: Calculating Probabilities».
Из этой статьи вы узнаете, почему циклы незаменимы в построении статистических моделей.
Циклы — одно из фундаментальных понятий в программировании на Python. Особенно важны эти знания при работе с большим массивом данных.
У многих занимающихся статистикой и дата сайенс, возникает мысль: «А зачем нам все это? Ведь привести наш код в порядок могут программисты!».
Но порой человек, пишущий код, должен знать и статистику, и способы обработки выходных данных. Эти процессы неразделимы!
Вот один из примеров, когда умелое применение for облегчает и улучшает статистический анализ.
Кумулятивные биномиальные вероятности — краткий экскурс
Для вычисления вероятности нам необходимы две переменные: N (число наблюдений) и λ (лямбда — количество попаданий в цель/количество благоприятных исходов в серии экспериментов). Кумулятивная биномиальная вероятность означает следующее: с увеличением количества испытаний возрастает шанс возникновения какого-либо события.
probability = 1-((1-λ)^N)
Пример. Возьмем «честный» шестигранный кубик и вычислим вероятность выпадения 6. Она равна 1/6. Но мы проведем этот эксперимент 10 раз подряд:
1-((1-0.1667)^10) = 0.8385
Как видите, шанс выпадения 6 увеличивается до 83.85%.
Закон больших чисел гласит: увеличиваем количество испытаний — увеличивается шанс возникновения какого-либо события. Это утверждение справедливо даже в том случае, если вероятность события в рамках одного испытания очень низкая. А теперь мы разберем, как увеличивается вероятность события с увеличением количества испытаний.
Модель без циклов
Ниже — скрипт, вычисляющий кумулятивную биномиальную вероятность без циклов:
import numpy as np import pandas as pd l = 0.02 m = 0.04 n = 0.06 p=np.arange(0, 100, 1) h = 1 - l j = 1 - m k = 1 - n q = 1-(h**p) r = 1-(j**p) s = 1-(k**p)
- l , m и n — вероятности определенных событий.
- p — количество испытаний (до 100)
- q , r и s — кумулятивные биномиальные вероятности. Их значение будет расти вместе с количеством испытаний.
Вывод:
>>> q array([0., 0.02, 0.0396, 0.058808, 0.07763184, 0.0960792, 0.11415762, 0.13187447, 0.14923698, 0.16625224, . 0.8532841, 0.85621842, 0.85909405, 0.86191217, 0.86467392]) >>> r array([0., 0.04, 0.0784, 0.115264, 0.15065344, 0.1846273, 0.21724221, 0.24855252, 0.27861042, 0.307466, . 0.97930968, 0.9801373, 0.9809318, 0.98169453, 0.98242675]) >>> s array([0., 0.06, 0.1164, 0.169416, 0.21925104, 0.26609598, 0.31013022, 0.35152241, 0.39043106, 0.4270052, 0.46138489, 0.49370179, 0.52407969, 0.5526349, 0.57947681, . 0.99720008, 0.99736807, 0.99752599, 0.99767443, 0.99781396])
Как видим, вероятности q , r и s растут прямо пропорционально количеству испытаний.
Но у модели без использования циклов есть существенный недостаток — вероятности событий указываются конечным пользователем. А что, если мы захотим перебрать вероятности от 0.01 до 0.99?
Модель с циклами: генераторы списков и двумерные массивы
В этот раз мы рассмотрим другую модель: у нас будет лишь одно событие и его вероятность. Значения будут перебираться от 0.01 до 0.99. Количество испытаний все то же — 100.
import numpy as np import pandas as pd # генератор списка probability = [x*0.01 for x in range(1,100)] probability = np.array(probability) h = 1 - probability # создаем двумерный массив result = 1-h[:, np.newaxis] ** np.arange(1,100) print(result)
Вывод:
>>> probability array([0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, . 0.96, 0.97, 0.98, 0.99])
Обратите внимание, что использование генератора списков обязательно. Причина проста — функция range() работает только с int , а не с float .
Возможно, вы заметили, что предпоследняя строка кода строит двумерный массив для вычисления кумулятивных биномиальных вероятностей. Если бы мы не использовали двумерный массив, результат был бы другой: мы бы вычислили значения, но они не были бы отсортированы.
>>> for i in range(1,100,1): >>> print(1-(h**i)) [0.01 0.02] [0.0199 0.0396] . [0.62653572 0.86191217] [0.63027036 0.86467392]
Вместо этого мы бы хотели видеть отсортированный массив: [0.01, 0.0199, …, 0.62653572, 0.63027036] и [0.02, 0.0396, …, 0.86191217, 0.86467392] .
Что интересно — транспонирование не даст нужного результата, так как h — одномерный массив.
Можно поступить так: вычислить двумерный массив и вывести его в консоль напрямую:
>>> result = 1-h[:, np.newaxis] ** np.arange(1,100) >>> result array([[0.01, 0.0199, 0.029701, . 0.62653572, 0.63027036], [0.02, 0.0396, 0.058808, . 0.86191217, 0.86467392], [0.03, 0.0591, 0.087327, . 0.94946061, 0.9509768], . [0.97, 0.9991, 0.999973, . 1., 1., 1.], [0.98, 0.9996, 0.999992, . 1., 1., 1.], [0.99, 0.9999, 0.999999, . 1., 1.,1.]])
Как видите, мы только что вычислили кумулятивную биномиальную вероятность для интервала от 0.01 до 0.99.
Также использование цикла for облегчило нам задачу, ведь мы автоматически вычислили нужные нам вероятности — от 0.01 до 0.99! Делать все это вручную — задача сложная и неблагодарная.
Вывод
Итак, мы научились:
- вычислять кумулятивную биномиальную вероятность.
- использовать циклы for для перебора огромного диапазона значений.
- работать с float при помощи генератора списков.
- работать с двумерными массивами, если транспонирование одномерного не имеет смысла.
Вероятность в Python: перестановки и сочетания
Теория вероятности не сложная, по крайней мере, на уровне, необходимом для начала работы в науке о данных. Возможно, прошло какое-то время с тех пор, как вы познакомились с этой темой, и, если ваши знания немного ослабли, эта статья поможет вам вернуться в русло.
Быстрый поиск в Google выявляет 4 основные математические темы, на которых основана вся область:
- Линейная алгебра
- Анализ
- Статистика
- Вероятность
Сегодня я расскажу о двух важнейших концепциях из теории вероятности: сочетаниях и перестановках.
Начнем с базового определения самой вероятности:
Вероятность — степень (относительная мера, количественная оценка) возможности наступления некоторого события. В теории вероятностей вероятность принимает значения от 0 до 1. Значение 1 соответствует достоверному событию, невозможное событие имеет вероятность 0. Чем выше значение, тем больше вероятность события.
Вероятность как область научного знания важна, потому что неопределенность и случайность встречаются повсеместно, соответственно, знание о вероятности помогает принимать более информированные решения и осмыслять неопределенности.
Перед погружением в перестановки и сочетания, нужно понять еще один термин — факториал.
Что такое факториал?
Хороший вопрос. Согласно Википедии:
Факториал — функция, определённая на множестве неотрицательных целых чисел. Факториал натурального числа n определяется как произведение всех натуральных чисел от 1 до n включительно.
Факториал вычисляется по следующей формуле:
Теперь вы, возможно, задумались, как вычислять факториалы в Python. Во многих библиотеках есть готовые функции, но создать собственную функцию тоже очень легко, и именно это мы и сделаем.
Вот простая рекурсивная функция, которая справится с задачей:
Теперь можно использовать эту функцию для проверки примера выше:
Хорошо, но где факториалы используются в реальном мире?
Скажем, в гонке участвуют пять человек, и вы хотите узнать количество способов, по которым эти пятеро могут финишировать первыми, вторыми или третьими. Можно взять листок бумаги и просто записать все возможные варианты, но зачем? Что если участников 100?
Вот как эта задача решается с помощью факториалов:
Это называется перестановка.
Перестановки
И снова начнем с определения:
В математике перестановка — это упорядочение членов набора в последовательность или, если последовательность уже определена, перестановка (изменение порядка) ее элементов.
Существует два способа вычисления перестановок. Выбор способа зависит от того, разрешается повторение или нет. Давайте рассмотрим на примере.
У вас есть веб-сайт, на котором могут регистрироваться пользователи. Им нужно вводить пароль длиной строго в 8 символов, которые не должны повторяться. Сперва нужно определить, сколько букв и цифр в английском алфавите:
- количество букв: 26
- количество цифр: 10
То есть всего 36. Тогда n = 36, а r = 8, потому что пароль должен быть длиной в 8 символов. Зная это, мы легко можем рассчитать количество уникальных паролей, используя формулу:
Если вы поспешили и посчитали вручную:
В Python это тривиальная задача:
Здорово, но я хочу разрешить пользователям повторно использовать символы. Нет проблем, в данном случае это перестановки с повторениями, формула еще проще:
Мы уже знаем, что n (36) и r (8), так что вот решение:
И снова реализация на Python тривиальна:
Это действительно большое число. Попробуйте произнести его вслух!
Сочетания
Далее на повестке дня — сочетания. Вам наверняка любопытно, что это такое и в чем их отличие от перестановок. Начнем с определения:
Сочетание— это выбор значений из набора, в котором (в отличие от перестановок) порядок выбора не имеет значения.
Чтобы понять это определение, разберем следующий пример: группа людей, выбранных в команду — это та же самая группа, независимо от порядка участников. Вот и вся идея сочетаний. Если выбрать 5 членов команды, можно упорядочить их по имени, росту или другому параметру, но команда останется прежней — порядок не имеет значения.
Давайте запишем это формулой. Количество сочетаний C набора из n объектов, взятых по r, рассчитывается так:
С этим уравнением мы можем решить следующую задачу: сколькими способами можно выбрать в футбольную команду 5 человек из 10?
Группа будет той же, порядок значения не имеет. Значит, n = 10, а r = 5:
И это можно легко сделано в Python:
Великолепно! Но интересно, существует ли версия сочетаний с повторениями? Да!
Представьте, что готовите сэндвич и по какой-то причине вам нужно использовать только 4 ингредиента из 10. Однако ингредиенты не должны быть уникальны, например, можно положить 3 куска сыра и 1 кусок салями. Как это здорово, я тоже обожаю сыр, вот спасибо!
Но как сформулировать эту идею математически? Ответ снова прост:
Давайте применим формулу к примеру выше. n снова равно 10 (потому что 10 возможных ингредиентов), а r = 4 (потому что выбрать можно только 4):
Используем Python для проверки:
И напоследок
Сочетания и перестановки математически просты, однако сложность заключается в том, как представить в такой форме реальные проблемы. Иногда бывает трудно выделить значения n и r в повседневной жизни. Я не могу решить для вас подобные задачи, но надеюсь, что данная статья поможет вам разобраться.
- Как организовать код в Python
- Превращаем сценарии Python в инструменты МО
- Создаем чат-бот в Python с помощью nltk