В самый обычный вторник, Геннадию Обмануеву вдруг пришла гениальная идея: создать лотерею, в которой каждый игрок может сам указывать свой шанс на победу и, следовательно, множитель выигрыша и играть на выставленных им правилах! Для того, чтобы всегда оставаться в плюсе, Геннадий в конце каждой удачной игры берет символическую плату в 5% от выигрыша.
*если кратко об игре
Как и в случае с казино, чем дольше игрок играет в такую игру — тем более вероятно, что он, в конце концов, проиграет. Но неужели нельзя обмануть хитрого дядю, придумав чудесную тактику, благодаря которой можно увеличить свои шансы на победу?
Для начала попробуем стандартную тактику в любых начинаниях: сотня тысяч итераций со случайными значениями. В среднем, это покажет результаты огромной массы людей, которые играют не систематично. Естественно, что ставить на процент 100% с пятипроцентным налогом неразумно, поэтому ставки ограничим от 10% (названный Геннадием минимум) до 94%.
Я знаю только php, поэтому писать буду на нем, думаю, он вполне всем понятен:
<?php $bank = 1000000000; //банк богатого хитрого дяди define('START_MONEY', 10000); $money = START_MONEY; //деньги игрок for($i = 0; $i < 100000; $i++){ $bet = mt_rand(10, 100); //минимальная ставка = 10. $chance = mt_rand(10, 94); //94+ ставить нет смысла - забирает комиссия $random = mt_rand(1, 100); $money -= $bet; $bank += $bet; //сразу отправляем деньги игрока в банк if($chance >= $random){ $money += $bet * 95/$chance; //отдаем игроку :) $bank -= $bet * 100/$chance; //забираем у банка :) } } echo floor($money-START_MONEY);
Результаты получились предсказуемыми, но не систематичными из-за огромной доли случайности в игре.
Я пять раз запустил этот цикл, у меня вышли результаты:
- Игрок проигрывает 225043.
- Игрок проигрывает 272766.
- Игрок проигрывает 320369.
- Игрок проигрывает 276055.
- Игрок проигрывает 254899.
Результаты выглядят плачевно: наши игроки задолжал хитрому дяди ~25 первоначальных денег. В среднем, игроки проигрывают за 100 000 итераций ~250 000 условных единиц. Попробуем добавить логику в наш алгоритм. Естественно, самым разумным было бы написать
break;
в начале цикла, но мы не ищем простых путей! Начнем со смены случайных значений. Попробуй играть при строго поставленных значениях. Например, минимальную ставку на максимальный шанс. К чему приведет такая тактика?
$bet = 10; $chance = 94;
В результате мы, конечно, проигрываем намного меньше, ведь мы и ставим меньше! Хотя можно заметить, что проигрыш стал более предсказуемым. Он колеблется около 50 000, практически без разброса.
- Игрок проигрывает 50940.
- Игрок проигрывает 50900.
- Игрок проигрывает 51274.
- Игрок проигрывает 51041.
- Игрок проигрывает 49344.
Величина проигрыша не столь важна, если мы проигрываем десятки начальных сумм и должны хитрому Геннадию. Я специально не меняю алгоритм в сторону «вовремя остановиться», потому что мне интересно, возможно ли получить положительные результаты после 100 000 итераций.
Попробуем играть при минимальной ставке и минимальном шансе выиграть.
$bet = 10; $chance = 10;
Опять мы проигрываем. На этот раз разброс очень большой, и это логично: ведь мы играем при минимальном шансе на победу.
- Игрок проигрывает 37650.
- Игрок проигрывает 58075.
- Игрок проигрывает 52660.
- Игрок проигрывает 43635.
- Игрок проигрывает 40310.
Кстати, что интересно: если в лотереи минимальная ставка была бы 0.1%, то результаты стали бы такими:
- Игрок Выигрывает 83000!
- Игрок проигрывает 78500.
- Игрок проигрывает 12000.
- Игрок Выигрывает 7000!
- Игрок проигрывает 69000.
Множитель получается настолько маленьким, что увеличивает нашу ставку почти в тысячу раз, но это происходит так нечасто, что результаты абсолютно непредсказуемые.
Попытаемся применить какой-нибудь алгоритм для выигрыша. Например: чем больше денег мы выиграли, тем рискованнее мы можем играть. Я реализовал это таким образом:
$bank = 1000000000; //банк define('START_MONEY', 10000); $money = START_MONEY; //деньги игрока for($i = 0; $i < 100000; $i++){ $bet = 10; $pre_chance = 100 * (2 - 0.94 * $money/START_MONEY); //94+ ставить нет смысла - забирает комиссия if($pre_chance > 94){ $chance = 0.94; }else{ $chance = $pre_chance; } $random = mt_rand(1, 1000)/10; $money -= $bet; $bank += $bet; //сразу отправляем деньги игрока в банк if($chance >= $random){ $money += $bet * 95/$chance; //отдаем игроку :) $bank -= $bet * 100/$chance; //забираем у банка :) } } echo floor($money-START_MONEY);
*надеюсь, это работает
И также у меня ничего не вышло, разброс результатов был большим, но в любом случае я проигрывал.
Тогда я попробовал пойти на серьезную меры, организовав «внутренний карман». Туда игрок складывает деньги, которые ни за что не потратит, чтобы остаться хоть с какими-нибудь грошами. Пришлось поменять логику, потому что сейчас попыток будет явно меньше, чем 100 000. И самое важное, что я сделал: я поставил игроку цель. Например, увеличить выигрыш вдвое.
$bank = 1000000000; //банк define('START_MONEY', 10000); $money = START_MONEY; //деньги игрока $pocket = $money/2; $money /= 2; $goal = START_MONEY*2; for($i = 0; $i < 100000; $i++){ if($money < START_MONEY/10){ break; //доигрались... } if($money >= $goal){ break; //наигрались! } $bet = mt_rand(10, $money/10); //минимальная ставка = 10. $chance = mt_rand(10, 94); //94+ ставить нет смысла - забирает комиссия $random = mt_rand(1, 100); $money -= $bet; $bank += $bet; //сразу отправляем деньги игрока в банк if($chance >= $random){ $money += $bet * 95/$chance / 2; //половину отдаем игроку :) $pocket += $bet * 95/$chance / 2; //половину кладем в карман :) $bank -= $bet * 100/$chance; //забираем у банка :) } } echo floor($money-START_MONEY);
И только при таком раскладе, с некоторой вероятностью, я начал выигрывать относительно небольшие суммы. Впрочем, проигрывать тоже.
Вывод
В играх, где процент уходит «заведению» или хитрому Геннадию Обмануеву, при длительной игре большого количества людей выиграть мне не удалось и сомневаюсь, что это возможно. В любом случае, в связи с тем, что события происходят случайно, а лотерея забирает выигрыш в любом случае, она всегда остается в плюсе. Налог в данном случае выполняет ту же цель, что и Zero на рулетке в казино: смещает общий шанс победы в сторону заведения, а не игрока.
Об ошибках в тексте и в логике кода сообщайте, пожалуйста, в личные сообщения. Я оперативно исправлю.
Кстати, может кто-нибудь может придумать алгоритм, который-таки побеждает в этой лотереи? Было бы очень интересно. Какой алгоритм действительно является самым лучшим в этой игре?
ссылка на оригинал статьи http://habrahabr.ru/post/179639/
Добавить комментарий