2010-02-22 31 views
10

Anh trai tôi bước sang tuổi 21 trong một vài tuần và bố mẹ tôi và tôi đang đưa anh ấy đến Las Vegas. Vào ngày 21, tôi mang $ 200 để đánh bạc ở Vegas và về nhà với giá khoảng 450 đô la, chủ yếu là từ việc chơi craps. Tôi có kế hoạch mang lại 200 đô la một lần nữa cho chuyến đi này và trước khi tôi đi, tôi nghĩ tôi sẽ chạy một số mô phỏng craps để xem liệu tôi có thể tăng gấp đôi số tiền của mình một lần nữa hay không.Tỷ lệ cược: Mô phỏng một trò chơi của Craps

Tôi đã đọc từ một số nguồn mà ngôi nhà có lợi thế nhỏ nhất trong craps khi đặt cược qua với tỷ lệ cược tối đa. Từ bộ nhớ của tôi, và theo khảo sát của Wizard of Odds, hầu hết các sòng bạc trên Dải là 3-4-5 tỷ lệ cược với tối thiểu là $ 5. Tính đến điều này, đây là một mô phỏng của một phiên craps (của 100 xúc xắc cuộn) trong 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/>'; 

} 

?> 

Có điều gì sai với toán học của tôi ở đây không? Trong khi có những đỉnh và đáy trong suốt mỗi phiên, mô phỏng này thường tăng gấp đôi số tiền của nó trước khi bị phá vỡ. Xem xét căn nhà luôn luôn có lợi thế trong craps, ngay cả khi nó chỉ là một phần nhỏ của một phần trăm, tôi bị bối rối bởi kết quả này.

Trả lời

5

Vâng, ngay lập tức, tôi có thể thấy rằng bạn đã gặp lỗi trong trường hợp thắng 7 hoặc 11 đơn giản: Bạn phải thắng cược, không phải gấp đôi số tiền đặt cược của bạn.

Chỉnh sửa: Tôi tin rằng khoản thanh toán cho đặt cược tỷ lệ tương ứng với xác suất thực tế. Bạn gấp hai lần khả năng cuộn 7 (mất tỷ lệ cược của bạn) hơn 10, vì vậy bạn sẽ được trả tiền 2: 1 khi bạn thắng trên 4 hoặc 10; và chỉ được trả 6: 5 khi bạn thắng 6 hoặc 8.

+1

Tôi đã sửa đổi nguồn - trông nó như thế nào? Tỷ lệ thắng cược có cần điều chỉnh hay mô phỏng đúng không? – Kevin

+1

@Kevin: Tôi nghĩ rằng bạn đã nhận được tất cả các khoản thanh toán chính xác ngay bây giờ, với sự hiểu biết của tôi về craps. Tuy nhiên, câu trả lời được đưa ra bởi những người khác có chứa những cách để cải thiện và mở rộng trên mô phỏng của bạn. –

9

Tôi nên cẩn thận với bất kỳ đoạn mã nào được viết để "chứng minh" bạn có nhiều khả năng tăng gấp đôi số tiền của bạn tại craps (hoặc bất kỳ trò chơi nào khác cơ hội) trước khi bạn phá vỡ. Las Vegas là một thành phố ngổn ngang trong sa mạc Nevada như một minh chứng cho hai điều:

  1. Cuối cùng, ngôi nhà luôn luôn thắng
  2. dân không giỏi toán

Không có trò chơi bất kỳ casino sẽ đặt trên sàn nhà của họ mà không tận dụng cả hai quy tắc. Nếu mã của bạn không đồng ý với Vegas, tôi sẽ bỏ tiền vào Vegas.

Cập nhật:

Dưới đây là một số C++ tôi đã viết dựa trên mã gốc của bạn. Vấn đề ban đầu bạn đã đăng là nếu bạn có thể tăng gấp đôi số tiền của mình trước khi bạn chia tay thường xuyên hơn không. Tôi theo dõi mã tôi đã viết với một số kết quả.

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

Kết quả:

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

Mã của bạn trông giống như những gì tôi nghĩ ra, ngoại trừ việc bạn cần phải tính đến số tiền đặt cược ban đầu khi tính cược. I E. 'odds = std :: min (tiền mặt - bet_k, bet_k * 3);' thay vì 'odds = std :: min (tiền mặt, bet_k * 3);' – ghoppe

+1

Cảm ơn, đã cập nhật; thật thú vị, tôi không thấy thay đổi đó có ảnh hưởng gì đến kết quả. Điều đó sẽ làm cho một sự lôi kéo thú vị từ Vegas: đặt cược vào tỷ lệ cược, và Vegas cho bạn một tỷ lệ cược tối thiểu đặt cược vào nhà! – fbrereto

4

Bạn đang không kiểm tra để xem nếu bạn có đủ còn lại trong stash để đặt tỷ lệ cược mong muốn của bạn đặt cược. Trong thực tế, bạn không kiểm tra kích thước của stash của bạn cả. Không ngạc nhiên khi mô phỏng này sẽ có thể đánh bại ngôi nhà thường xuyên hơn nếu bạn có thể đặt cược ngay cả khi kích thước stash của bạn là âm.

Bằng cách này, tôi chạy 50.000 lặp mô phỏng lại 100 con xúc xắc ném (với sửa đổi của tôi đặt cược tối đa stash còn lại) và đã đưa ra như sau:

thắng: 23807

thiệt hại: 25465

đẩy (bạn để lại với $ 200): 728

avg. tiền thắng: $ 109.07

+2

Một điều khác tôi vừa nhận ra, mô phỏng của bạn ném xúc xắc 100 lần và bỏ đi mà không quan tâm đến số tiền còn lại trên bàn, vì vậy số tiền thắng và số thắng sẽ ít hơn một chút. – ghoppe

+1

Vì vậy, tôi đã chạy kịch bản sửa đổi này (50.000 lần lặp) với báo trước bổ sung "không để lại tiền trên bàn" mười lần và đưa ra tỷ lệ phần trăm thắng sau: 48,6%, 48,1%, 48,2%, 48,0%, 47,7%, 48,4%, 48,0%, 48,2%, 48,2%, 47,7%. Tóm lại: không, bạn không thể đánh bại Vegas. :) – ghoppe

Các vấn đề liên quan