В этом видео мы обсудим, как работать со случайностью в Python. Давайте начнем с вот этого блока и давайте запустим, а потом обсудим, что здесь происходит. Что здесь происходит? Сначала у нас, во-первых, мы загрузим библиотеку для работы со случайными числами, и для сокращения записи загрузим ее как "rand", с таким именем. И сначала сгенерируем случайное число от нуля до пяти. На самом деле, мы хотим просто шесть возможных исходов, как на кубике. Самый простой способ — это сгенерировать число от нуля до шести, до пяти, и для этого мы запускаем функцию "randrange" в интервале от нуля до шести. То есть если мы запустим с аргументом шесть, то он сгенерирует целое число от нуля до шести. И в нашем случае получилось три. У нас шесть возможных исходов от нуля до пяти, можем перезапустить, посмотреть, что получится еще раз, если мы запустим. Получилось — один. На самом деле, понятно, что это не максимально удобно, у нас обычно на кубике написано число от одного до шести, а мы генерируем от нуля до пяти. Это несложно поправить, для этого достаточно запустить ту же функцию с двумя аргументами. Тогда первый аргумент — это начало отрезка целочисленного, а второй аргумент — это его окончание. То есть у нас здесь генерируется число от одного до шести, последнее число не включается. Действительно, вот видно, что у нас здесь сгенерировалось шесть, извините, три. Можно перезапустить, получилось шесть — максимальное число получилось. Хорошо. Также мы можем генерировать случайные числа из множества. Для этого мы можем использовать функцию "choice", и вот у нас здесь четыре элемента, и мы сгенерируем случайно и равновероятно объект из них. Вот в нашем случае получилось A. Давайте попробуем еще раз, получится C. Ту же самую функцию можно применить, близкую функцию можно применить для случая, когда у нас не равновероятное распределение. Давайте рассмотрим такой пример: у нас есть лотерея. Возможные исходы — это выиграть 1000 рублей, 100 рублей или ноль рублей. У них вероятности неравные, мы хотим, чтобы первый исход происходил с вероятностью одна сотая, второй исход с вероятностью одна десятая, а третий исход — с оставшейся вероятностью. И тогда мы можем сгенерировать, применить ту же функцию. Мы задаем список исходов, а также задаем для них веса. Веса могут быть целочисленные, они потом отнормируются. То есть в нашем случае сумма весов — 100, поэтому для подсчета вероятности они просто поделятся на сумму этих весов. И мы сгенерируем это 10 раз. Давайте вот, ради интереса, сгенерируем это 10 раз. Предположим, что мы 10 раз воспользовались лотереей, и посмотрим, что получилось. Значит, вот здесь напечатаются просто все наши выигрыши, они, собственно, уже напечатаны, вот результаты. Получилось у нас тут таким образом, что мы ни разу не выиграли ничего. Дальше в конце подсчитывается общий выигрыш, мы 100 умножаем на количество раз, сколько раз выиграли 100 рублей, 1000 умножаем на количество раз, сколько выиграли 1000 рублей. И у нас действительно оказалось ноль. Давайте запустим еще раз, все-таки, может быть, нам повезет. Нет, снова мы ничего не выиграли. Вот тут мы, да, один раз выиграли 100 рублей. Действительно, вот в третьем эксперименте у нас получилось 100 рублей. Давайте попробуем, то есть можно поменять количество и сгенерировать больше распределение. Вот мы больше раз сыграли и суммарно выиграли 2100 рублей. Вот такие подсчеты можно делать, и такие эксперименты можно ставить. Хорошо, давайте обсудим также генерацию выборки без возвращений. И вот пример, то есть мы можем сгенерировать. Для этого мы, опять же, используем функцию "rand.sample", для генерации выборки без возвращения используется она. И у нас здесь, опять же, задано множество, из которого мы генерируем выборку, это в данном случае цифры от нуля до восьми. И мы генерируем вот четыре числа без возвращения, то есть они будут обязательно разными. Давайте попробуем еще раз, чтобы убедиться, что они действительно разные, попробуем сгенерировать их все. И вот окажется, что, действительно, просто у нас генерируется случайная перестановка чисел от нуля до восьми. Хорошо, дальше мы можем также работать с матожиданиями в Python, и для этого мы загрузим просто функцию "mean" из библиотеки "statistics". И давайте вот посмотрим на пример, который мы разбирали на лекции: мы хотим посчитать среднюю оценку за тест. У нас есть тест, вернее, мы сдали три теста, получили оценки 78, 72 и 87, хотим посчитать среднюю оценку. И достаточно просто запустить одну команду, убедиться, что наш подсчет в лекции был правильный, средняя получается 79. Также можем поставить, давайте перейдем к последнему блоку, мы можем поставить такой вероятностный эксперимент: мы можем подбросить кубик много раз и посмотреть, какое получается число в среднем. Мы вот обсуждали в лекции, что в среднем должно получаться, если очень много раз это делать, 3.5. И это мы и называли матожиданием. Но давайте поставим эксперимент. Давайте подбросим кубик 10 раз, и если подбросить кубик 10 раз, вот получилось ровно 3.5, но это, на самом деле, нам повезло сильно. То есть это может быть 3.7, и может быть вот, например, довольно далеко от 3.5 — 2.8. На самом деле подбрасывать 10 раз — это довольно мало, давайте подбросим 100 раз, и тогда у нас, скорее всего, будет все довольно близко: 4, 3.49, 3.45. Можно и 1000 раз подбросить, в принципе, это не так уж долго, и вот здесь видно, что уже мы довольно близки к 3.5.