2010-02-22 10 views
10

Mój brat kończy 21 lat za kilka tygodni, a ja i rodzice zabieramy go do Las Vegas. Na moje 21, przyniosłem 200 $ na hazard w Vegas i wróciłem do domu z około 450 $, głównie z gry w kości. Planuję przynieść 200 $ na tę podróż i zanim pójdę, pomyślałem, że poprowadzę symulacje craps, żeby sprawdzić, czy mogę ponownie podwoić moje pieniądze.Kostki w kości: Symulacja gry w Craps

Z kilku źródeł dowiedziałem się, że dom ma najmniejszą przewagę w grze w kości podczas stawiania zakładu passline z maksymalnym kursem. Z mojej pamięci i według ankiety przeprowadzonej przez Wizard of Odds większość kasyn na pasku wynosi 3-4-5, a minimalna kwota to 5 $. Biorąc to pod uwagę, jest tu symulacja sesji gry w kości (z 100 kości zwoje) w PHP:

<?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/>'; 

} 

?> 

czy jest coś nie tak z moim matematyki tutaj? Chociaż podczas każdej sesji występują wartości szczytowe i doliny, ta symulacja częściej podwaja swoje pieniądze, zanim się zepsuje. Biorąc pod uwagę, że dom zawsze ma przewagę w kościach, nawet jeśli to zaledwie ułamek procenta, jestem zdumiony tym wynikiem.

Odpowiedz

5

Cóż, od samego początku, widzę, że masz błąd w prostym przypadku wygranej 7 lub 11: Powinieneś wygrać zakład, a nie dwa razy tyle.

Edycja: Uważam, że wypłata za zakład odds jest współmierna do rzeczywistego prawdopodobieństwa. Masz dwa razy większe prawdopodobieństwo rzutu na 7 (przegrana) niż 10, więc powinieneś otrzymać wypłatę 2: 1, gdy wygrywasz na 4 lub 10; i wygrywasz tylko 6: 5, gdy wygrywasz na 6 lub 8.

+1

Zmodyfikowałem źródło - jak ci teraz wygląda? Czy wygrane z kursów wymagają korekty lub czy symulacja jest poprawna? – Kevin

+1

@Kevin: Myślę, że wszystkie wypłaty są teraz poprawne, zgodnie z moim rozumieniem craps. Jednak odpowiedzi udzielane przez inne osoby zawierają sposoby na ulepszenie i rozszerzenie symulacji. –

9

Będę ostrożny z jakimkolwiek kodem napisanym, aby "udowodnić", że masz większe szanse na podwojenie twoich pieniędzy w kości (lub jakiejkolwiek innej grze przypadku) zanim się spłukacie. Las Vegas jest rozrastającego się miasta na pustyni w Nevadzie jako testament do dwóch rzeczy:

  1. Ostatecznie dom zawsze wygrywa
  2. Ludzie są złe w matematyce

Nie ma gry każdy kasyno postawiłby na swoim piętrze, który nie korzystałby z obu zasad. Jeśli twój kod nie zgadza się z Vegas, wkładam moje pieniądze do Vegas.

Aktualizacja:

Oto C++ pisałem na podstawie oryginalnego kodu. Pierwotny problem, który opublikowałeś, polegał na tym, że możesz podwoić swoje sumy, zanim częściej będziesz zbankrutować. Podążyłem za kodem, który napisałem, z pewnymi wynikami.

#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; 
} 

Wyniki:

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

Twój kod wygląda na to, co wymyśliłem, z wyjątkiem tego, że musisz wziąć początkowy zakład pod uwagę przy obliczaniu zakładu kursów. to znaczy. 'odds = std :: min (gotówka - bet_k, bet_k * 3);' zamiast 'odds = std :: min (gotówka, bet_k * 3);' – ghoppe

+1

Dzięki, zaktualizowany; co ciekawe, nie zauważyłem, aby ta zmiana miała jakikolwiek wpływ na wyniki. To by było interesujące przyciągnięcie z Vegas: postaw na kursy, a Vegas daje ci minimalny zakład na dom! – fbrereto

4

Nie jesteś sprawdzając, czy masz wystarczająco lewo na zapas, aby postawić żądane kursy zakład. W rzeczywistości nie sprawdzasz rozmiaru swojego skrytka w ogóle. Nie jest niespodzianką, że ta symulacja będzie w stanie pokonać dom częściej, jeśli będziesz w stanie obstawiać, nawet jeśli Twój rozmiar będzie ujemny.

Nawiasem mówiąc, wpadłem 50000 iteracji symulacji 100 kości rzuca (z mojej modyfikacji maksymalnym zakładem zapas pozostałej) i przyszedł z następujących:

Wygrane: 23807

Przegrane: 25465

Push (odejść z $ 200): 728

śr. wygrane: 109,07 $

+2

Jeszcze jedna rzecz, którą sobie uświadomiłem, twoja symulacja rzuca kostką 100 razy i odchodzi bez względu na to, ile pieniędzy pozostało na stole, więc średnie wygrane i liczba wygranych powinny być nieco mniejsze. – ghoppe

+1

Więc uruchomiłem ten zmodyfikowany skrypt (50 000 iteracji) z dodatkowym zastrzeżeniem "nie pozostawiając pieniędzy na stole" dziesięć razy i otrzymałem następujące procentowe wygrane: 48,6%, 48,1%, 48,2%, 48,0%, 47,7%, 48,4%, 48,0%, 48,2%, 48,2%, 47,7%. W skrócie: nie, nie możesz pokonać Vegas. :) – ghoppe