Zar oranlar: Bulut bir oyun simulasyonu

3 Cevap php

Kardeşim hafta ve ailem bir çift 21 çıkıyor ve ben Las Vegas onu alıyor. Benim 21, Vegas'ta kumar için 200 $ getirdi ve çoğunlukla barbut oynarken, yaklaşık 450 $ ile eve geldi. Ben bu gezi için tekrar 200 $ getirerek planlıyoruz ve ben düşündüm gitmeden önce ben yine paramı çift görmek için bazı barbut simülasyonları çalıştırmak istiyorum.

Ben maksimum oran ile passline bahis oynarken evi barbut en küçük avantaja sahip olduğunu çeşitli kaynaklardan okudum. Wizard of Odds tarafından incelenen benim bellek, ve gibi, Strip üzerinde en casinolar bir 5 $ minimum 3-4-5 oran vardır. Bu husus dikkate alınarak, burada PHP (100 zar rulo) bir barbut oturumda bir simülasyon olduğunu:

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

}

?>

Burada benim matematik ile yanlış bir şey var mı? Her oturumda boyunca zirveler ve dipler olsa da, bu simülasyon daha sık kırdı gitmeden önce, para iki katına çıkar. Bir yüzde sadece bir kısmını bile olsa evin her zaman, barbut kenarı vardır göz önüne alındığında, ben bu sonucu çapraşık ediyorum.

3 Cevap

Peki, derhal kapatın, ben size basit 7 veya 11 galibiyet durumunda bir hata var olduğunu görebilirsiniz: Siz iki kez bahis, bahis değil kazanmak gerekiyordu.

Edit: Ben oran bahis için ödeme gerçek olasılık ile orantılı olduğuna inanıyorum. Sen daha 10 (şansınızı kaybedersiniz) 7 rulo olma olasılığı iki kat, yani bir 4 veya 10 kazanmak zaman 02:01 para almam gerektiğini; Eğer 6 veya 8 kazanmak sadece ve sadece 06:05 ödedi.

Seni kırdı gitmeden önce barbut (ya da diğer şans oyununda) paranızı ikiye katlamak için daha olasıdır "kanıtlamak" için yazılmış bir kod herhangi bir parça ile dikkatli olurdum. Las Vegas iki şey için bir vasiyet olarak Nevada çölünde büyüyen bir şehirdir:

  1. Sonunda, evin her zaman kazanır
  2. İnsanlar matematik de kötü

Herhangi bir casino hem kuralları kaldıraç vermedi kendi katında vereceğini oyun yok. Kodunuzu Vegas katılmazsa, ben Vegas paramı koyuyorum.

Update:

İşte bazı C + + I orijinal koduna dayalı yazdı. Eğer daha sık kırdı gitti önce paranızı iki katına çıkabilir eğer yayınlanan orijinal sorun oldu. Ben bazı sonuçları ile yazdı kodunu izledi.

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

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

Sonuçlar:

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

Size istediğiniz oran bahis için saklamak sol yeterli olup olmadığını görmek için kontrol etmiyoruz. Aslında, size tüm saklamak boyutunu kontrol etmiyorsunuz. Bu simülasyon sizin zula boyutu negatif olsa bile bahis mümkün olup olmadığını daha sık ev yenmek mümkün olacak şaşırtıcı bulunuyor.

Arada, 100 zar simulasyon 50,000 yineleme (kalan saklamak maksimum bahis benim modifikasyonu) atar koştu ve aşağıdaki ile geldi:

Kazandığım: 23807

kayıplar: 25465

(200 $ ile bırakın) itmek: 728

ort. kazanç: 109,07 $