我會小心寫任何代碼來「證明」你更有可能在擲骰子(或任何其他遊戲的機會)在你破產之前。拉斯維加斯是內華達州的沙漠爲證明一個龐大的城市有兩點:
- 最終,房子總是贏
- 人是壞的數學
沒有任何遊戲賭場會放在他們的地板上,這不會影響這兩個規則。如果你的代碼與拉斯維加斯不同意,我會把錢投到拉斯維加斯。
更新:
下面是一些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
我修改了源代碼 - 它現在對你來說有什麼樣的看法?賠率獎金需要調整還是模擬正確? – Kevin 2010-02-22 07:57:20
@凱文:我認爲你現在已經獲得了所有的支出,以我的理解胡扯。但是,其他人給出的答案包含了改進和擴展仿真的方法。 – 2010-02-23 02:28:21