№3-4 Лабораторная работа "Игра в рулетку на Python"
Введение
Вероятность событий
Математическое ожидание
Матожидание и рулетка
Ставка на число
Моделирование игры в рулетку
Три стратегии с матожиданиями
Первая стратегия
Вторая стратегия
Третья стратегия
Вывод результата по трем стратегиям
Строим графики
Задание 1
Задание 2
2.55M

3-4 lab (1)

1. №3-4 Лабораторная работа "Игра в рулетку на Python"

Системы искусственного интеллекта
№3-4 ЛАБОРАТОРНАЯ РАБОТА
"ИГРА В РУЛЕТКУ НА PYTHON"

2. Введение

ВВЕДЕНИЕ
Все знают про игру "Рулетка". Кратко напомним ее правила:
• Есть круг, поделённый на 37 или 38 частей.
• Из них 18 чёрные.
• 18 — красные.
• Одно или два «зеро» зелёного цвета.
• Игрок делает ставку на что-то из этого круга.
• Крупье запускает шарик. Шарик крутится по рулетке и выпадает на одно из полей.
• Если игрок угадал, куда упадёт шарик, он забирает свою ставку и сколько-то денег сверху.
• Если не угадал, его ставка уходит в казино.
Комбинаций ставок очень много. Мы рассмотрим самую популярную ставку на красное или чёрное.
Например, если игрок ставит на цвет — красное или чёрное, — то получает назад удвоенную сумму ставки.
Может казаться, что с такими выплатами можно постоянно оказываться в плюсе: ведь достаточно угадать цвет, а он выпадает почти в
половине случаев. Но всё наоборот: гораздо чаще люди проигрывают, чем выигрывают. Давайте разберёмся, почему так происходит.
• Мы рассматриваем какие-то вероятные события в будущем.
• Вероятность этих событий описывается числом. Например, 1 — вероятность 100%, событие точно произойдёт. 0,5 — событие
происходит в среднем в половине случаев.
• Если событие связано с каким-то выигрышем или проигрышем, мы используем несложную математику, чтобы оценить
прибыльность той или иной игры.
• Вот это число, которое описывает прибыльность, — называется математическим ожиданием.

3. Вероятность событий

ВЕРОЯТНОСТЬ СОБЫТИЙ
Допустим, мы кидаем обычный игральный кубик с числами от 1 до 6. Вероятность выпадения единицы — ⅙, потому что все стороны кубика
одинаковые и выпадают случайным образом.
Это можно представить в виде простой математики:
Если у нас есть несколько равновозможных и одинаковых событий, то вероятность наступления любого из них равна 1/n, где n — количество таких
событий.

4. Математическое ожидание

МАТЕМАТИЧЕСКОЕ ОЖИДАНИЕ
Математическое ожидание — одно из основных понятий в теории вероятностей. Его можно вычислить, как сумму
произведения вероятностей каждого события на их результат.
Математическое ожидание — это усреднённый результат, который мы получим при каждой попытке сыграть в игру. Чем
больше будет таких попыток, тем ближе наш результат к математическому ожиданию.
Поясним на примере с игральным кубиком.
Мы знаем, что вероятность выпадения каждой грани — ⅙, а числа на кубике идут от 1 до 6. Мы выбросили в первый раз:
выпала 6. Второй раз — 1. Потом 4. Потом 2. Потом 5. И так далее. Можно ли предугадать, какой будет средний результат
после нескольких сотен игр?
Оказывается, можно. Зная только вероятность и число очков на каждой стороне кубика, можно заранее сказать, каков будет
средний результат выбрасывания этого кубика, если бросать его достаточно долго. Это считается по формуле:
(⅙ × 1) + (⅙ × 2) + (⅙ × 3) + (⅙ × 4) + (⅙ × 5) + (⅙ × 6) = 21/6 = 3,5
Чем больше раз мы кинем кубик, тем ближе к этому числу будет наше среднее значение.
Получается, что математическое ожидание показывает, какой результат мы получим в среднем, если будем играть в игру
достаточно долго.

5.

Знание математического ожидания может помочь нам принять правильное решение в азартных играх, спорах и
финансовых делах.
Представим игру: нам предлагают бросить игральный кубик и получить столько рублей, сколько выпало на кубике.
Цена одного броска — три рубля. Стоит играть в такую игру или нет?
С точки зрения матожидания — да, стоит, и вот почему:
Мы знаем, что матожидание при каждом броске кубика — 3,5. В нашей игре это значит, что средний выигрыш за
бросок после условных 1000 бросков будет 3,5 рубля.
Так как матожидание выше, чем стоимость одного броска, то нам нужно не просто соглашаться на такую игру, а
играть в эту игру как можно дольше, чтобы со временем выйти на средние значения прибыли 0,5 рубля за бросок.
Можно кинуть кубик 10 раз подряд так, что на нём выпадут только 1, 2 или 3 — и тогда мы как будто в минусе. Но
если мы будем играть в эту игру достаточно долго, мы будем в выигрыше.
Главное, что нужно запомнить: математическое ожидание не гарантирует, что мы получим именно этот результат
с первой попытки. Если мы будем продолжать эти попытки достаточно долго, то тогда мы, скорее всего,
приблизимся к нужному результату.

6. Матожидание и рулетка

МАТОЖИДАНИЕ И РУЛЕТКА
Теперь, когда мы знаем теорию, то можем посчитать матожидание для игры в рулетку и ставок на ней.
Многие думают, что если ставить на красное или на чёрное, то шансы выиграть или проиграть равные — 50 на 50. Но это
не так. Всё дело в зеро — оно создаёт отрицательное математическое ожидание для игрока, и проиграть получается
проще, чем выиграть.
Если у нас одно зеро, то всего получается 18 чёрных + 18 красных + зеро = 37 ячеек в рулетке. Допустим, мы ставим на
красное, тогда наш шанс на победу — 18/37 = 48,6%. Выходит, что шанс проиграть у нас выше — 51,4%. Разница — 2,8%.
Если при каждой ставке мы ставим тысячу рублей, то такая разница в шансах даёт нам отрицательное математическое
ожидание в 28 рублей не в нашу пользу. Это значит, что в среднем при каждой ставке мы теряем 28 рублей с каждой
тысячи.
Интересно то, что теряем мы их не каждый раз: нет такого, что после каждой ставки кто-то залез нам в карман и достал
оттуда 28 рублей. Но если какая-то масса людей сделает какую-то массу ставок, то в итоге, по сумме денег, которая у них
останется на руках, они увидят убыток 2,8%. Но так как они не будут считать деньги друг друга, они этого не узнают.
Казино зарабатывают именно за счёт зеро, которое создаёт отрицательное матожидание для игрока. Если в рулетке
секторов зеро два, это в два раза увеличивает матожидание в пользу казино.
Чтобы зарабатывать, казино не нужно мухлевать, заряжать рулетку, изготавливать намагниченные шарики и т. д.
Достаточно просто иметь один шальной сектор, который создаёт отрицательное матожидание.

7. Ставка на число

СТАВКА НА ЧИСЛО
Для ясности рассмотрим ещё один вариант ставок, когда игрок ставит на конкретное число или даже на зеро и при
выигрыше получает в 35 раз больше, чем поставил.
Скорее всего, вы уже видите, в чём тут подвох: ставка больше в 35 раз, а секторов — как минимум 37. Это значит,
что при ставке в тысячу рублей матожидание будет равно 35/37 × 1000 рублей = 945 рублей. Выходит, в этом случае
игрок теряет даже больше, чем просто при выборе цвета — 55 рублей против 28.
Если играть в рулетку долго, то из-за отрицательного матожидания игрок постепенно будет терять деньги, пока
они не закончатся. Чем дольше играет, тем больше потеряет.

8. Моделирование игры в рулетку

МОДЕЛИРОВАНИЕ ИГРЫ В
РУЛЕТКУ
Мы смоделируем на языке Python игру в рулетку по трём стратегиям с разными матожиданиями и посмотрим, как они влияют на результат. Чтобы
было нагляднее, мы построим график ставок и выигрышей для каждой стратегии.
В каждой стратегии мы всегда начинаем с определенной суммы, а ставим небольшую долю от этой суммы, например, одну тысячную.
Ставить всегда мы будем только на чёрное.
Мы сделаем три модели рулетки:
• Классика. В первом случае мы смоделируем классическую рулетку как в казино с отрицательным матожиданием. Для этого нам понадобится 18
чёрных цифр, 18 красных и зеро. Теоретически, играя по этой стратегии, мы должны со временем проиграть.
• Во второй стратегии мы сделаем нулевое матожидание — уберём зеро. Это даст нам равные шансы при каждой ставке, поэтому, скорее всего, при
том же количестве ставок, что и в первый раз, мы останемся с плюс-минус той же суммой. Не ровно той же, а примерно такой же.
• Третья стратегия — делаем положительное матожидание. Для этого мы убираем зеро и одну красную цифру, чтобы у нас было 18 чёрных и 17
красных. Это значит, что мы вероятнее выиграем, чем проиграем, поэтому при том же количестве ставок мы должны неплохо заработать.
ПОДГОТОВКА
Подключим необходимые в программе модули: модуль случайных чисел random и библиотеку для графиков plotly.
Всё, что понадобится для проверки каждой стратегии, мы вынесем в отдельные переменные. Это позволит нам легко поменять нужные числа при
необходимости в одном месте, а не искать по всей программе.
Для подсчёта статистики сделаем переменные, где будем хранить данные о количестве побед и проигрышей. А для графиков — будем запоминать
номер игры и количество денег, которые у нас остались.

9.

10. Три стратегии с матожиданиями

ТРИ СТРАТЕГИИ С МАТОЖИДАНИЯМИ
В каждой стратегии будем ставить на цвет, на чёрное. Чтобы понять, сыграла ставка или нет, мы каждый раз будем брать случайное число от 1 до 37:
18 чёрных, 18 красных и зеро.
Чтобы было проще, пусть числа от 1 до 18 у нас будут чёрные, с 19 по 36 — красные, а 37 будет зеро.
Первая стратегия: запускаем модель игры. Если выпало чёрное — мы выиграли. В этой стратегии у нас 18 выигрышных вариантов и 19 проигрышных,
поэтому матожидание будет отрицательным.
Вторая стратегия: убираем зеро. У нас получается по 18 чёрных и красных чисел, и вероятность выиграть — ровно 50 на 50. Это даёт нам нулевое
матожидание.
Третья стратегия: убираем зеро и одно красное число, чтобы было 18 чёрных и 17 красных. Так как вероятность попасть на чёрное выше, чем на
красное, то матожидание будет положительным.
Когда будете читать код, обратите внимание на такую строку:
if ball in range(1,19)
Дело в том, что Python работает с диапазоном range () так: первое число входит в рабочий диапазон, а конечное — нет. Поэтому, чтобы нам проверить,
попало ли наше число в диапазон от 1 до 18 включительно, нам нужно указать range (1,19).

11. Первая стратегия

ПЕРВАЯ СТРАТЕГИЯ
Внимательно изучите программный код игры по первой стратегии,
расположенный ниже.
Обратите внимание:
конструкция цикла с предусловием: while money > 0 (пока значение
переменной money больше 0)
конструкция условия: if bet > money (если bet больше money)
команда, генерирующая случайное целое число в диапазоне от 1 до 37:
randint(1,37)
команда win += 1 — это сокращенная запись win = win + 1
Запустите программный код первой стратегии.

12. Вторая стратегия

ВТОРАЯ СТРАТЕГИЯ
Ниже представлен код по второй стратегии. Изучите и запустите его

13. Третья стратегия

ТРЕТЬЯ СТРАТЕГИЯ
Ниже представлен код по третьей стратегии. Изучите и запустите его.

14. Вывод результата по трем стратегиям

ВЫВОД РЕЗУЛЬТАТА ПО ТРЕМ СТРАТЕГИЯМ
Ниже представлен код, который выводит результаты по трем стратегиям. Изучите код и запустите его.
Результат нужно будет скопировать и разместить в разделе "Итоги лабораторной работы".
Кажется, что все три варианта дают примерно одинаковый результат, но на самом деле в первом случае вы останетесь без денег, а в
третьем — разбогатеете. Чтобы было нагляднее — построим графики.

15. Строим графики

СТРОИМ ГРАФИКИ
Для графиков мы используем библиотеку Plotly и рисуем сразу все три графика на одном поле — это даст нам наглядность и
понимание, к чему приводит разное матожидание. Чтобы было понятно, какой график отвечает за какую стратегию, мы их подпишем.
Запустите код, расположенный ниже. Будет построена диаграмма.
Зеленая линия — это баланс нашей первой игры с отрицательным матожиданием. Мы предсказуемо всё проиграли.
Фиолетовая линия — график баланса при нулевом матожидании. Видно, что мы то выигрывали, то проигрывали, но в результате мы
всё равно остались примерно с той же суммой, что и начинали.
Красная линия — наш баланс при положительном матожидании. Мы выигрывали чаще, чем проигрывали, поэтому удвоили нашу
стартовую сумму.
Сохраните полученную диаграмму в формате png, нажав на первую кнопку (Download plot as a png) во всплывающем справа вверху
меню диаграммы.
Сохраненная диаграмма вам понадобится в разделе "Итоги лабораторной работы".

16.

17. Задание 1

ЗАДАНИЕ 1
Запустите программу (начиная с первой ячейки) 3 раза подряд. После каждого запуска разместите ниже результаты и
полученные диаграммы.
Рекомендация: Все ячейки в блокноте (всю программу) лучше запускать с помощью команды в главном меню.
В главном меню сверху выберите пункт "Среда выполнения", затем "Выполнить все" или нажмите Ctrl+F9.
• Результаты первого запуска программы (выполнение всех ячеек):
...
• Полученная первая диаграмма:
...
• Результаты второго запуска программы (выполнение всех ячеек):
...
• Полученная вторая диаграмма:
...
• Результаты третьего запуска программы (выполнение всех ячеек):
...
• Полученная третья диаграмма:
...

18. Задание 2

ЗАДАНИЕ 2
Измените значение коэффициента ставки (переменная bet_coef) в разделе "Подготовка". Выполните все ячейки.
Проанализируйте изменившиеся результаты и график. Напишите, к чему привело изменение коэффициента ставки?
...
Разместите ниже полученную диаграмму:
...
ЗАДАНИЕ 3
Верните первоначальное значение коэффициента ставки (bet_coef = 0,001) в разделе "Подготовка".
Добавьте во все стратегии на один сектор больше. Поскольку количество "выигрышных" секторов неизменно (их 18),
то дополнительный сектор будет "проигрышным".
Внесите изменения в программый код. Выполните все ячейки. Проанализируйте изменившиеся результаты и график.
Напишите, к чему привело добавление дополнительного "проигрышного" поля во все стратегии?
...
Разместите ниже полученную диаграмму:
...
English     Русский Правила