Тщетные попытки победить лотерею

в 9:35, , рубрики: алгоритм, Алгоритмы, игра, искусственный интеллект, лотерея, математика, теория вероятностей, метки: , , ,

Представим воображаемый хитрого дядю, который хочет обмануть и заработать деньги на «лопухах». Назовем его Геннадий Обмануев.
В самый обычный вторник, Геннадию Обмануеву вдруг пришла гениальная идея: создать лотерею, в которой каждый игрок может сам указывать свой шанс на победу и, следовательно, множитель выигрыша и играть на выставленных им правилах! Для того, чтобы всегда оставаться в плюсе, Геннадий в конце каждой удачной игры берет символическую плату в 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);

Результаты получились предсказуемыми, но не систематичными из-за огромной доли случайности в игре.
Я пять раз запустил этот цикл, у меня вышли результаты:

  1. Игрок проигрывает 225043.
  2. Игрок проигрывает 272766.
  3. Игрок проигрывает 320369.
  4. Игрок проигрывает 276055.
  5. Игрок проигрывает 254899.

Результаты выглядят плачевно: наши игроки задолжал хитрому дяди ~25 первоначальных денег. В среднем, игроки проигрывают за 100 000 итераций ~250 000 условных единиц. Попробуем добавить логику в наш алгоритм. Естественно, самым разумным было бы написать

break;

в начале цикла, но мы не ищем простых путей! Начнем со смены случайных значений. Попробуем играть при строго поставленных значениях. Например, минимальную ставку на максимальный шанс. К чему приведет такая тактика?

$bet = 10;
$chance = 94;

В результате мы, конечно, проигрываем намного меньше, ведь мы и ставим меньше! Хотя можно заметить, что проигрыш стал более предсказуемым. Он колеблется около 50 000, практически без разброса.

  1. Игрок проигрывает 50940.
  2. Игрок проигрывает 50900.
  3. Игрок проигрывает 51274.
  4. Игрок проигрывает 51041.
  5. Игрок проигрывает 49344.

Величина проигрыша не столь важна, если мы проигрываем десятки начальных сумм и должны хитрому Геннадию. Я специально не меняю алгоритм в сторону «вовремя остановиться», потому что мне интересно, возможно ли получить положительные результаты после 100 000 итераций.

Попробуем играть при минимальной ставке и минимальном шансе выиграть.

$bet = 10;
$chance = 10;

Опять мы проигрываем. На этот раз разброс очень большой, и это логично: ведь мы играем при минимальном шансе на победу.

  1. Игрок проигрывает 37650.
  2. Игрок проигрывает 58075.
  3. Игрок проигрывает 52660.
  4. Игрок проигрывает 43635.
  5. Игрок проигрывает 40310.

Кстати, что интересно: если в лотереи минимальная ставка была бы 0.1%, то результаты стали бы такими:

  1. Игрок Выигрывает 83000!
  2. Игрок проигрывает 78500.
  3. Игрок проигрывает 12000.
  4. Игрок Выигрывает 7000!
  5. Игрок проигрывает 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 + $pocket >= $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 на рулетке в казино: смещает общий шанс победы в сторону заведения, а не игрока.

Об ошибках в тексте и в логике кода сообщайте, пожалуйста, в личные сообщения. Я оперативно исправлю.

Кстати, может кто-нибудь может придумать алгоритм, который-таки побеждает в этой лотереи? Было бы очень интересно. Какой алгоритм действительно является самым лучшим в этой игре?

Автор: LysoSutriN

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js