Мой брат поворачивается 21 за несколько недель и моих родителей, и я беру его в Лас-Вегас. Для моего 21-го я принес 200$ для азартной игры в Лас-Вегасе и пришел домой приблизительно с 450$, главным образом от проигрывания костей. Я планирую обеспечение 200$ снова для этого прохождения и прежде чем я пойду, я думал, что выполнил некоторые загаженные моделирования, чтобы видеть, могу ли я удвоить свои деньги снова.
Я читал из нескольких источников, что дом имеет самое маленькое преимущество в костях при размещении passline ставки с максимальными разногласиями. От моей памяти, и, как рассмотрено Мастером Разногласий, большинство казино на Полосе является 3-4-5 разногласиями с минимумом за 5$. При принятии этого во внимание вот моделирование загаженной сессии (100 бросков костей) в PHP:
';
}
?>
Есть ли что-то не так с моей математикой здесь? В то время как существуют пики и канавки в течение каждой сессии, это моделирование чаще удваивает свои деньги перед разорением. Рассмотрение дома всегда имеет преимущество в костях, даже если это - просто часть процента, я озадачен этим результатом.
Что ж, сразу я вижу, что у вас ошибка в простом случае 7 или 11: вы должны выиграть ваша ставка, а не двойная ставка.
Изменить: Я считаю, что выплата по ставке на коэффициенты соизмерима с реальной вероятностью. Вероятность выпадения 7 (проигрыш) в два раза выше, чем у 10, поэтому вам должны заплатить 2: 1, когда вы выиграете при выпадении 4 или 10; и платил 6: 5 только при выигрыше 6 или 8.
Вы не проверяете, достаточно ли у вас осталось в заначке, чтобы сделать ставку на желаемый коэффициент. На самом деле, вы вообще не проверяете размер своей заначки. Неудивительно, что в этой симуляции вы сможете чаще выигрывать у дома, если сможете делать ставки, даже если размер вашей заначки отрицательный.
Кстати, я прогнал 50 000 итераций вашей симуляции 100 бросков костей (с моей модификацией максимальной ставки от оставшейся заначки) и получил следующее:
выигрыши: 23807
проигрыши: 25465
толчок (вы уходите с $200): 728
средний выигрыш: $109.07
Я был бы осторожен с любым куском кода, написанным для "доказательства" того, что вы с большей вероятностью удвоите свои деньги в крэпсе (или любой другой азартной игре), прежде чем разоритесь. Лас-Вегас - разросшийся город в пустыне штата Невада, свидетельствующий о двух вещах:
Нет ни одной игры, которую казино поставило бы на свою площадку и которая не использовала бы оба правила. Если ваш код не согласен с Вегасом, я ставлю на Вегас.
Обновление:
Вот немного C++, который я написал на основе вашего оригинального кода. Первоначальная проблема, которую вы поставили, заключалась в том, сможете ли вы удвоить свои деньги до того, как чаще всего разоритесь. Я проследил за написанным мной кодом и получил некоторые результаты.
#include <iostream>
int die_roll()
{
return std::rand() % 6 + 1;
}
int win_count_g(0);
int loss_count_g(0);
// return true when double our money.
// return false when we can't bet anymore.
bool test_loop(int cash)
{
static const int bet_k(5);
int goal(cash * 2);
int button(0);
while (true)
{
if (cash >= goal)
return true;
else if (cash < bet_k)
return false;
int roll(die_roll() + die_roll());
int odds(0); // additional odds bet
if (button == 0)
{
if (roll == 7 || roll == 11)
{
++win_count_g;
cash += bet_k;
}
else if (roll == 2 || roll == 3 || roll == 12)
{
++loss_count_g;
cash -= bet_k;
}
else
{
button = roll;
if (roll == 4 || roll == 10)
{
odds = std::min(cash - bet_k, bet_k * 3);
}
else if (roll == 5 || roll == 9)
{
odds = std::min(cash - bet_k, bet_k * 4);
}
else // if (roll == 6 || roll == 8)
{
odds = std::min(cash - bet_k, bet_k * 5);
}
}
}
else
{
if (roll == 7)
{
++loss_count_g;
button = 0;
cash -= bet_k + odds;
}
else if (roll == button)
{
++win_count_g;
button = 0;
cash += bet_k;
if (roll == 4 || roll == 10)
{
cash += odds * 2;
}
else if (roll == 5 || roll == 9)
{
cash += odds * 3 / 2;
}
else // if (roll == 6 || roll == 8)
{
cash += odds * 6 / 5;
}
}
}
}
}
void test(int cash)
{
win_count_g = 0;
loss_count_g = 0;
int doubled(0);
int broke(0);
for (int i(0); i < 10000; ++i)
if (test_loop(cash))
++doubled;
else
++broke;
float win_percentage(static_cast<float>(doubled) / (doubled + broke) * 100.0);
std::cout << "starting cash: $" << cash
<< "; doubled: " << doubled
<< "; broke: " << broke
<< " (" << win_percentage << "% win)"
<< "; loop wins: " << win_count_g
<< "; loop losses: " << loss_count_g
<< std::endl;
}
int main ()
{
static const int cash_set_k[] =
{
5,
10,
20,
50,
100,
200,
400,
800,
1000
};
static const int cash_set_size_k(sizeof(cash_set_k) / sizeof(cash_set_k[0]));
std::for_each(&cash_set_k[0], &cash_set_k[cash_set_size_k], &test);
return 0;
}
Результаты:
starting cash: $5; doubled: 4944; broke: 5056 (49.44% win); loop wins: 4944; loop losses: 5056
starting cash: $10; doubled: 4862; broke: 5138 (48.62% win); loop wins: 19706; loop losses: 20258
starting cash: $20; doubled: 4755; broke: 5245 (47.55% win); loop wins: 78360; loop losses: 80320
starting cash: $50; doubled: 4345; broke: 5655 (43.45% win); loop wins: 489406; loop losses: 502506
starting cash: $100; doubled: 3553; broke: 6447 (35.53% win); loop wins: 1914393; loop losses: 1972273
starting cash: $200; doubled: 2468; broke: 7532 (24.68% win); loop wins: 7172464; loop losses: 7375024
starting cash: $400; doubled: 861; broke: 9139 (8.61% win); loop wins: 22615369; loop losses: 23277609
starting cash: $800; doubled: 112; broke: 9888 (1.12% win); loop wins: 54556881; loop losses: 56121041
starting cash: $1000; doubled: 31; broke: 9969 (0.31% win); loop wins: 69308617; loop losses: 71296217