2010-02-22 170 views
10

我的兄弟在幾周內翻21,我和我的父母帶他去拉斯維加斯。在我的第21場比賽中,我帶來了200美元在拉斯維加斯賭博,並以450美元左右回家,其中大部分來自擲骰子。我計劃再次爲這次旅行帶來200美元,在我走之前我想我會運行一些模擬賭博遊戲,看看我能否再次增加我的資金。骰子的機率:模擬骰子的遊戲

我從幾個消息來源讀到,房子有最小的優勢時,擲骰子與最大賠率下線。從我的記憶中可以看出,在Wizard of Odds的調查中,拉斯維加斯大多數賭場的賠率爲3-4-5,最低爲5美元。考慮到這一點,下面是PHP中的擲骰子會話(100個骰子卷)的模擬:

<?php 

$stash = 200; 
$bet = 5; 

for($i=100; $i--;) { 

    $dice1 = mt_rand(1, 6); 
    $dice2 = mt_rand(1, 6); 
    $total = $dice1 + $dice2; 

    if(!$button) { 
     if($total===7 || $total===11) { 
      $stash += $bet; 
     } 
     elseif($total===2 || $total===3 || $total===12) { 
      $stash -= $bet; 
     } 
     else { 
      $button = $total; 
      if($total===4 || $total===10) { 
       $odds = $bet*3; 
      } 
      elseif($total===5 || $total===9) { 
       $odds = $bet*4; 
      } 
      elseif($total===6 || $total===8) { 
       $odds = $bet*5; 
      } 
     } 
    } 
    else { 
     if($total===7) { 
      $button = 0; 
      $stash -= ($bet + $odds); 
     } 
     elseif($total===$button) { 
      $button = 0; 
      $stash += $bet; 
      if($total===4 || $total===10) { 
       $stash += $odds*2/1; 
      } 
      elseif($total===5 || $total===9) { 
       $stash += $odds*3/2; 
      } 
      elseif($total===6 || $total===8) { 
       $stash += $odds*6/5; 
      } 
     } 
    } 

    echo 'Stash: $'.$stash.'<br/>'; 

} 

?> 

我的數學在這裏有什麼問題嗎?雖然每個環節都有高峯和低谷,但這種模擬在破產之前更多時候會增加一倍。考慮到房子在擲骰子方面總是有優勢,即使只有百分之零點幾,我也爲此感到困惑。

回答

5

那麼,馬上就可以看到,在簡單的7或11勝的情況下,你有一個錯誤:你應該贏得你的賭注,而不是你的賭注的兩倍。

編輯:我相信賠率下注賠率與實際概率相稱。你擲出7次(失去賠率)的可能性是10次的兩倍,所以當你以4或10獲勝時,你應該得到2:1的獎金。並且只有在6或8贏的時候才支付6:5。

+1

我修改了源代碼 - 它現在對你來說有什麼樣的看法?賠率獎金需要調整還是模擬正確? – Kevin 2010-02-22 07:57:20

+1

@凱文:我認爲你現在已經獲得了所有的支出,以我的理解胡扯。但是,其他人給出的答案包含了改進和擴展仿真的方法。 – 2010-02-23 02:28:21

9

我會小心寫任何代碼來「證明」你更有可能在擲骰子(或任何其他遊戲的機會)在你破產之前。拉斯維加斯是內華達州的沙漠爲證明一個龐大的城市有兩點:

  1. 最終,房子總是贏
  2. 人是壞的數學

沒有任何遊戲賭場會放在他們的地板上,這不會影響這兩個規則。如果你的代碼與拉斯維加斯不同意,我會把錢投到拉斯維加斯。

更新:

下面是一些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 
+2

您的代碼看起來像我想出的,除非您在計算您的賠率下注時需要考慮初始賭注。即。 'odds = std :: min(cash - bet_k,bet_k * 3);'而不是'odds = std :: min(cash,bet_k * 3);' – ghoppe 2010-02-22 19:07:06

+1

謝謝,更新;有趣的是,我沒有看到這種變化對結果有任何影響。這會讓拉斯維加斯獲得一場有趣的拉力賽:賭一把,拉斯維加斯就會給你一個最低賠率的賭注! – fbrereto 2010-02-22 19:25:18

4

你不檢查,看看是否有足夠的留在藏匿的地方你想要的賠率賭。事實上,你根本沒有檢查你的隱藏大小。如果你能夠下注,即使你的存款大小是負值,這個模擬也能夠更經常地擊敗房子,這並不奇怪。

順便說一句,我跑你的100個骰子投擲的模擬50,000迭代(用我剩餘藏匿的最大賭注的修改),並具有以下想出了:

勝:23807個

損失: 25465

推(你以$ 200出發):728

avg。獎金:$ 109.07

+2

我剛剛意識到的另一件事是,你的模擬投擲骰子100次並走開,而不考慮桌子上剩下多少錢,所以平均獎金和勝利數應該比這少一點。 – ghoppe 2010-02-22 18:33:10

+1

所以我跑了這個修改後的腳本(5萬次迭代),並附加了10次「不留錢在桌子上」的提示,並提出了以下勝利百分比:48.6%,48.1%,48.2%,48.0%,47.7% 48.4%,48.0%,48.2%,48.2%,47.7%。總之:不,你不能擊敗拉斯維加斯。 :) – ghoppe 2010-02-22 18:57:07