Содержание
Нечестная игра, или как нас обманывают организаторы розыгрышей / Хабр
Однажды, солнечным весенним утром, почитывая городской форум, я наткнулся на ссылку с простенькой игрой от известной торговой сети. Игра (акция), посвящённая чемпионату мира по футболу, представляла собой незамысловатое поле три на три, заполненное футбольными мячами. Кликая по мячу, мы открывали картинку с тем или иным товаром. При открытии трёх одинаковых картинок участнику гарантировалось бесплатное получение данного товара в одном из магазинов сети. Также под одним из мячей имелось изображение красной карточки, открытие которой означало конец игры.
Интерес к игре быстро угасал по причине крайне редких случаев выигрыша. Играя вчетвером с 6 номеров телефона за несколько дней (около 15 партий) выиграть не удалось никому. “А какова вообще вероятность выиграть в данной игре?” — спросил я себя и достал лист бумаги, на ходу вспоминая курс высшей математики. Расписывая формулы, выяснилось, что каждая игра может содержать от 1 до 9 ходов, а каждый ход приводит к одному из трёх состояний — победа, поражение или продолжение игры (за исключением первых двух ходов, которые могут привести только к двум состояниям). Быстро поняв, что формула для 9 полей слишком сложна, я начал с простого — 4 поля (три одинаковых продукта и красная карточка). Быстрый набросок формул на салфетке, и выяснилось, что вероятность выигрыша — 1/4. Для 5 полей пришлось повозиться, но расчётная вероятность получилась также 25%. В этот момент, я задумался и трижды перепроверил расчёт. Всё верно. Не сказать, что я сильно удивился, ещё со времён учёбы в ВУЗе я привык, что в теории вероятности возможны самые неожиданные результаты. Расчёт для 9 полей занял бы несколько листов бумаги и не один час времени, поэтому было принято более простое решение. Смоделировать игру скриптом. Несколько десятков минут, кружка кофе, и скрипт готов. Использовался PowerShell, как инструмент, который всегда под рукой у системного администратора.
$fail = 0 $win = 0 for ($m=1; $m -lt 1001; $m++) { $mas = 1, 2, 3, 4, 5, 6, 7, 8, 9 $sum = 0 $result = "" for ($i=0; $i -lt 8; $i++) { $j = Get-Random -Minimum $i -Maximum 9 if ($mas[$j] -eq 9) { $result = "FAIL" break } if ($mas[$j] -eq 1 -or $mas[$j] -eq 2 -or $mas[$j] -eq 3) { $sum++ } if ($sum -eq 3) { $result = "WIN" break } $mas[$j] = 0 $mas = $mas | Sort-Object } $result if ($result -eq "WIN") { $win++ } if ($result -eq "FAIL") { $fail++ } } $fail $win
Выигрышные номера я принял за 1, 2 и 3, а красную карточку за 9. Забегу немного вперёд, как выяснилось позже, программисты, которые писали эту игру, мыслили примерно в том же ключе.
Запустив скрипт, я получил неожиданный результат — 25% выигрышей. Поиграв с количеством выигрышных элементов и общим количеством полей, я выяснил, что вероятность выигрыша в подобной игре не зависит от количества полей и равна единице, поделенной на количество выигрышных элементов, увеличенных на единицу.
В этот момент в мою голову закрались большие сомнения в честности игры. Ведь я должен был выигрывать каждый четвёртый раз. Но к тому времени я проиграл уже раз 10. Вероятность такого развития была крайне низка, и я начал исследовать скрипты игры.
А параллельно открыл правила.
Правила участия в маркетинговом мероприятии
1.3 Организатор гарантирует, что при определении возможности получения поощрений не используется алгоритмов или процедур, которые могут определить результаты Акции до начала ее проведения.
Отлично! Значит, доказав наличие этих алгоритмов и процедур, мы поймаем организатора за руку.
F12 в Chrome, и начинаем исследование. Играем до конца, одни глазом поглядывая в мониторинг сети. Достаточно стандартная работа приложения, загрузка страницы, скриптов, спрайтов и нескольких наборов данных в формате JSON. Но странное дело, от момента нажатия кнопки “Начать игру” до её завершения нет никакого обмена данными с сервером. Вторая странность — выигрышный спрайт даже не грузится, грузится только спрайт “Вы проиграли”. Очевидно, что скрипт ещё до начала игры “знает” её итог. Осталось поймать его за руку.
Основной JS с игрой очень большой, 1.5 Мб, без форматирования, всё «в кашу». Беглый поиск в Google выдал нам сервис JS Beautifier, и вот мы уже читаем отформатированный код. Но объём его очень велик, более 40 000 строк. Беглый просмотр JSON не дал результатов, слишком много данных, было решено идти другим путём — от обратного. Поиском по именам файлов спрайтов был найден JSON с нужными данными.
Спрайты 0, 1 и 2 — выигрышные, спрайт 3 — красная карта, остальные не имеют значения.
Поиск по имени массива спрайтов приводит нас в нужный блок скрипта игры.
Меня заинтересовал массив Outcome в скрипте, я ещё раз глянул в JSON, и о, чудо! Вы не поверите!
Да это же порядок выпадения спрайтов! И он заканчивается крайной картой! Абсолютно не важно, в какие поля вы кликаете мышкой, спрайты отображаются в заданном порядке, сгенерированном сервером. Сам сервер управляет процессом и регулирует вероятность. Никакой случайности не прослеживается.
Снова обратимся к правилам игры:
8. Призовой фонд:
8.1. Доступные призы: названия и количества
…
Итого 166000
Очевидно, что при честной игре призы закончатся ориентировочно через 664000 игр, что, видимо, не устроило руководство торговой сети с учётом времени проведения акции и потенциального количества участников.
Выводы (немного очевидные).
Играйте в честные оффлайн игры (например, шахматы). Не верьте организаторам онлайн-розыгрышей. Все врут. (с)
Сан Сити
Сан Сити
|
|
Вероятность
— Как найти лучшую формулу для этого алгоритма лотереи?
там, сэр.
Я разработчик и сейчас работаю над проектом. Итак, проблема в следующем…
Программа генерирует 6-значное число для выигрышного билета, каждая цифра которого находится в диапазоне (0-9) . Затем пользователь покупает несколько билетов и сравнивает их с выигрышным номером, чтобы выиграть. Я пытаюсь подсчитать, сколько наград останется невостребованными, если никто не сможет угадать и выиграть в лотерею.
Каждый раз, когда генерируется случайная последовательность, она сравнивается с выигрышной последовательностью. Последовательность разбивается на массив одиночных чисел.
Выигрышная последовательность и случайная последовательность по умолчанию представляют собой последовательности из 6 цифр.
Давайте сложим их рядышком.
индекс 0 | индекс 1 | индекс 2 | индекс 3 | индекс 4 | индекс 5 |
---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 |
1 | 2 | 3 | 9 | 8 | 6 |
«Уровень» совпадения равен мощности за вычетом первых N совпадающих чисел .
В приведенном выше примере совпадают первые три числа:
Как можно сказать, уровень матча 6-3 или 3, если призовой фонд 10000 долларов, то.
Уровень | Процент | Количество победителей | Приз каждому победителю $ |
---|---|---|---|
0 | 20% | 1 | 2000.0 |
1 | 10% | 3 | 333,3 |
2 | 14% | 9 | 155,6 |
3 | 12% | 27 | 44,4 |
4 | 19% | 81 | 23,5 |
5 | 25% | 243 | 10,2 |
Допустим, до конца лотереи покупается 100 000 билетов. Каков общий процент призов, которые остались невостребованными?
ПРИМЕЧАНИЕ.
- Если пользователь имеет право на уровень 0 (более высокий уровень), все цифры совпадают, поэтому все остальные уровни становятся недоступными для пользователя.
т. е. уровень 1,2 и т. д.
- Если все призы Уровня будут востребованы, пользователь может не выиграть ничего, что работает по принципу «первым пришел – первым обслужен». Это также означает, что 2 или более пользователей могут нарисовать одну и ту же последовательность, но только первый из них выиграет
.
МОЯ РАБОТА. ПОЖАЛУЙСТА, ДАЙТЕ МНЕ ЗНАТЬ, ПРАВИЛЬНО ЛИ Я ДЕЛАЮ ЭТО ИЛИ НЕПРАВИЛЬНО.
Я использовал пример, чтобы представить свою работу. Допустим, выигрышная последовательность 1-2-3-4-5-6.
Я использую кумулятивные биномиальные вероятности, чтобы получить % от общего числа призов, которые будут востребованы или не востребованы. Я использую вот этот калькулятор.
Начиная с уровня 5:
Пользователи должны нарисовать 1 , чтобы выиграть как минимум 10,2 приза.
Вероятность успеха в одном испытании: 0,1
Количество попыток: 10 000
Количество успехов (x): 243 (см. таблицу выше)
Таким образом, кумулятивные биномиальные вероятности > 0,999999
.
НАСТОЯЩИЙ ВЫПУСК
Когда я перешел к уровню 4:
Пользователи должны нарисовать цифру 1 И 2 , чтобы выиграть как минимум призы уровня 4.
Вероятность успеха в одном испытании: 0,1 * 0,999999(ОТ ПОСЛЕДНЕГО кумулятивная биномиальная вероятность)
Количество попыток: 1000 (Поскольку только 1/10 будет рисовать 1 в качестве первой цифры, поэтому только
Количество успехов (x): 81 (см. таблицу выше)
Итак, кумулятивные биномиальные вероятности > 0,98238842532.
Уровень 3
Пользователи должны нарисовать цифру 1, 2 и 3 , чтобы выиграть как минимум призы уровня 3.
Вероятность успеха в одном испытании: 0,1 * 0,999999 * 0,98238842532 (ОТ ПОСЛЕДНЕГО кумулятивная биномиальная вероятность)
Количество попыток: 100
Количество успехов (x): 27 (см. таблицу выше)
Таким образом, совокупные биномиальные вероятности 0,00000122394.
И Т.Д. ИМЕЕТ ЛИ ЭТО СМЫСЛ.
Решение MTV «Ты тот самый?»: возможно ли никогда не проигрывать? | by Hennie de Harder
Фото Oziel Gómez на Unsplash
Игра любви или игра логики?
Опубликовано в
·
Чтение: 10 мин.
·
27 декабря 2021 г.
Иногда очень приятно смотреть реалити-шоу с большим количеством драмы. «Are You the One?» — одно из таких шоу. У этого шоу есть забавный дополнительный компонент: оно побудило меня найти идеальный способ решить эту игру! Насколько сложно найти решение? Сколько раундов вам нужно в среднем? Как часто вы проигрываете, если играете много игр? Давайте оставим драму позади и попробуем решить эту игру, используя только логику и только логику!
Конечно, вы все знаете это телешоу или уже решили игру! Но если вы этого не сделаете, вот объяснение игры.
«Ты тот самый?» — это шоу, в котором 10 мужчин и 10 женщин пытаются найти свою идеальную пару. 10 идеальных пар определяются алгоритмом сватовства. Только одно решение является правильным. Живя вместе, участники пытаются найти решение максимум за 10 раундов. Если участники найдут все идеальные совпадения до того, как они выйдут из раундов, они выиграют определенную сумму денег.
Каждый раунд участники могут отправить одну пару в будку правды. В будке правды пара узнает, идеально ли они подходят друг другу. Позже происходит церемония сватовства, на которой мужчины или женщины выбирают себе пару. Они узнают, сколько спичек правильно с помощью световых лучей. Каждый луч означает идеальное соответствие. Если у них есть 10 идеальных совпадений, они выигрывают игру. Если им удается не найти ни одного идеального совпадения (помимо того, которое они обнаружили в будке правды), происходит отключение. Тогда они теряют половину призовых денег.
Общее количество возможных способов составить пары в игре с 10 мужчинами и 10 женщинами равно 10! == 10*9*8*7*6*5*4*3*2*1 == 3 628 800
Звучит не так просто, правда?!
Фото Кимсона Доана на Unsplash
Теперь, когда проблема ясна, осталось только запрограммировать и дать компьютеру дать ответы на наши вопросы. Мы собираемся попробовать два способа решения проблемы. Первый метод выбирает пары и совпадения случайным образом из тех, которые еще возможны. Это немного сопоставимо с тем, как в нее играют большинство участников, этим и интересен этот метод. Этот метод дает нам базовый балл. Второй использует алгоритм под названием минимакс.
Сначала мы импортируем несколько пакетов. Затем мы создаем две функции: одну, которая дает нам все возможные совпадения (или возможные ответы) в начале, и одну, которую мы можем использовать для извлечения возможных пар из возможных ответов (чтобы выбрать пару для будки правды). В начале количество возможных пар равно всем возможным комбинациям мужчины и женщины, поэтому возможных пар 10*10 = 100. Как упоминалось ранее, количество возможных совпадений равно 3 628 800.
Для этого эксперимента количество пар равно 10, как и в большинстве сезонов «Ты тот самый?». Если вы хотите поэкспериментировать с другим количеством пар, вы можете выбрать здесь другое значение.
Функция для создания всех возможных совпадений и еще одна функция для извлечения возможных пар из всех возможных ответов. Нам нужно создать возможные ответы только один раз, и мы можем повторно использовать их в каждой игре.
Во время игры мы удалим ответы из возможных с информацией, полученной из будки правды, и количеством правильных пар во время совпадений.
В будке правды пара может быть идеальной парой. Если это так, мы храним ответы только с этой парой. Если эта пара не идеально подходит, мы удаляем все ответы с этой парой.
Для церемонии матча мы выбираем один возможный ответ. Этот ответ содержит десять пар. Ответом церемонии является число от 0 до 10. Это число соответствует количеству идеальных совпадений. Если мы нашли 3 идеальных совпадения, мы оставляем только те ответы, которые имеют 3 общие пары с выбранным нами ответом.
Метод 1: Случайный выбор
В следующем разделе показан код для игры в одну игру «Ты тот самый?». Сначала делается случайный выбор из всех возможных ответов; эта цель представляет собой идеальное совпадение, которое нам нужно выяснить. В целях анализа мы сохраняем некоторые данные, такие как результат будки правды и количество идеальных совпадений во время церемонии сопоставления. И, конечно же, конечный результат: выиграл компьютер или проиграл?
У компьютера есть 10 ходов (или раундов), чтобы вычислить цель. Он начинается с отправки случайной пары из возможных пар в будку правды. Он сравнивает результат будки правды с возможными ответами и удаляет все возможные ответы, которые не совпадают с результатом будки правды. Затем он выбирает случайное совпадение из возможных ответов и использует количество идеальных совпадений, чтобы удалить все возможные ответы, в которых это условие не выполняется. Таким образом, количество возможностей уменьшается довольно быстро!
Код для запуска одной игры.
Затем нам нужен небольшой фрагмент кода для запуска функций. Давайте поиграем в 1000 сезонов «Ты тот самый?». Каковы ваши предположения? Сколько выиграет компьютер?
Код для воспроизведения «Ты тот самый?» 100 раз.
Сыграв в игру 100 раз, количество побед и поражений выглядит так:
Из 100 игр мы выигрываем 83 раза и проигрываем 17 раз, когда угадываем случайную пару для будки правды и случайный ответ для совпадения церемония. Эту тактику выбирают большинство участников, и это не так уж и плохо! Изображение автора.
Хорошо, 83% шанс выиграть миллион долларов, намного выше, чем в любой лотерее, здорово! Можно ли еще больше улучшить этот базовый показатель? Во время игры мы выбрали случайную пару для будки правды и случайный состав для церемонии матча. Вообще никакой оптимизации. Давайте продолжим с методом 2.
Внимание, спойлер: да, конечно, мы можем улучшить этот показатель!
Метод 2: Минимакс умножить на 2
В первом методе мы выбрали нашу пару будок правды и наши совпадения случайным образом (из возможных). Мы не учли важную вещь, а именно количество возможных ответов, оставшихся после выбора пары или совпадения. Если мы выберем пару, которая дает нам наименьшее количество оставшихся возможных ответов, мы можем улучшить уменьшение возможных ответов. Тот же принцип справедлив и для матч-апа.
Как подсчитать, сколько возможных ответов останется? Это другой процесс для пар по сравнению с совпадениями. Давайте углубимся.
Выбор пары для будки правды с помощью минимакса
Для пар мы можем подсчитать, сколько раз каждая пара встречается во всех возможных ответах. Есть две возможности: пара идеальная пара или пара не идеальная пара. Если пара идеально подходит, мы оставляем только возможные ответы, в которых присутствует пара. Если пара не идеально подходит, у нас остаются возможные ответы за вычетом количества возможных ответов, в которых была пара.
Пример: у нас осталось 50 возможных ответов. Одна пара встречается 10 раз в возможных ответах. Другая пара встречается в возможных ответах 27 раз. Для первой пары мы останемся с 10 (если пара идеально подходит) или 40 (нет совпадения, 50 минус 10) возможных ответов, максимальное из этих двух значений равно 40. Для второй пары мы останемся с 27 или 23 (50–27) возможных ответов, максимум 27. В этом случае лучше выбрать вторую пару, потому что минимум 27 и 40 равно 27.
Каждый ход мы выбираем пару, у которой наименьшее количество оставшихся ответов. Это объясняет название минимакс.
Идеальное совпадение, да или нет? Фото Сатьявана Наринедхата на Unsplash
Выбор наилучшего совпадения с минимаксным
Выбор совпадения, которое оставляет нам наименьшее количество возможных ответов, немного сложнее. Там, где кабина правды дает нам да или нет, ответ церемонии сопоставления находится между 0 и 10. Таким образом, в этом случае мы начинаем с одного возможного ответа и вычисляем оставшееся количество возможных ответов для всех возможных ответов. (от 0 до 10). Затем выбираем максимальное значение (так же, как и с парами). Повторите эти шаги для всех возможных ответов и выберите возможный ответ с наименьшим значением.
Пример, если бы мы играли в игру с 5 парами: мы выбираем возможный ответ. Есть 10 других ответов, которые имеют 0 общих пар (ответов), 20 ответов, которые имеют 1 общую пару, 25 ответов, которые имеют 2 общие пары, 23 ответа, которые имеют 3 общих пары, и 8 ответов, которые имеют 4 пары. общий. Максимальное возможное количество оставшихся ответов равно 25, поэтому для этого ответа мы выбираем 25. Повторяем эти вычисления для всех остальных возможных ответов и выбираем тот, у которого наименьшее максимальное значение.
Вычисление наилучшего совпадения довольно затратно, когда у вас осталось большое количество возможных ответов. Помните, что мы начинаем с 3 628 800 возможных ответов! Из-за этого я беру выборку из 100 совпадений в начале и беру минимакс этой выборки. Когда количество возможных ответов уменьшается, я беру выборку из 1000 совпадений или вычисляю их все (если количество возможных ответов меньше 1000).
Реализовано в коде:
Запуск занимает немного больше времени. Опять же, мы моделируем 100 игр. После ожидания… и ожидания… вот график выигрышей и проигрышей:
Результаты при использовании минимакс. Да, ваши глаза не врут, мы ВСЕГДА можем победить! Изображение автора.
Вау! 100 из 100! Это игра на логику, без чувств!
Бонус: Сравнение двух методов
Выигрыши и проигрыши очевидны, мы обязательно должны использовать метод 2 и выбирать пары и совпадения по минимаксному алгоритму. Но как насчет другой статистики?
Среднее количество оборотов, используемых в методах
Случайный метод занимает в среднем 8,53 раунда, тогда как минимаксный метод требует только 7,94 раунда. Графики распределения выглядят следующим образом:
Сколько витков было использовано? Минимакс использует меньше раундов, он чаще завершается за 6 раундов, чем за 10! Изображение автора.
Среднее уменьшение возможных ответов и пар
Также есть данные о количестве оставшихся возможных ответов после каждого хода. Давайте сравним два метода, взяв среднее значение по 100 играм для каждого раунда. Разделив средние возможные ответы, оставшиеся от случайного метода, на средние возможные ответы, оставшиеся от минимаксного метода, мы получим следующие числа. Из таблицы и графика видно, что в последних турах количество оставшихся возможных ответов минимакса более чем в 5 раз меньше, чем количество оставшихся возможных ответов от случайного угадывания! В последних двух турах она еще выше: почти 9раз!
Среднее количество оставшихся возможных ответов за раунд для случайного метода и минимаксного метода. Изображение автора.
Количество совпадений в будке истинной истины
Получим ли мы больше полных совпадений, отправив пары в будку истины по минимаксному методу? У нас нет цели получить идеальное совпадение, мы лишь хотим как можно быстрее уменьшить количество возможных ответов.
Графики снова показывают нам, что выигрывает минимакс. В среднем у него 2,8 идеальных совпадения. Случайный метод имеет только 1,63. Это разумно. Минимакс всегда будет выбирать пару, которая встречается ближе всего к 50% возможных ответов. Если это так, у вас есть 50% шанс, что пара действительно идеальная пара. При случайном угадывании это не так.
Количество идеальных совпадений в будках правды (максимум 10 за игру). Изображение автора.
Количество блэкаутов
Помните, что блэкаут тоже можно получить? Это происходит, когда у вас нет идеальных совпадений во время церемонии сопоставления. Участники теряют часть призовых, поэтому хотят этого избежать!
Количество отключений электроэнергии: опять минимакс побеждает! Изображение автора.