Я буду осторожен с любым фрагментом кода, написанным, чтобы «доказать», что вы с большей вероятностью удвоите свои деньги в крэпс (или в любой другой азартной игре), прежде чем разориться. Лас-Вегас - это большой город в пустыне Невады, свидетельствующий о двух вещах:
- В конце концов, дом всегда выигрывает
- Люди плохо разбираются в математике
Нет ни одной игры казино, которую можно было бы поставить на их поле, где бы не использовались оба правила. Если ваш код не согласен с Вегасом, я положу свои деньги на Вегас.
Обновление:
Вот немного 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