10

弟はあと数週間で 21 歳になり、両親と私は弟をラスベガスに連れて行きます。21 歳のとき、私はベガスでギャンブルに $200 を持ってきて、家には約 $450 を持って帰りました。ほとんどがクラップスでした。私はこの旅行のために再び 200 ドルを持っていくつもりです。行く前に、クラップス シミュレーションを実行して、お金を 2 倍にできるかどうかを確認しようと考えました。

複数の情報源から、クラップスで最大オッズでパスライン ベットを行う場合、ハウスのアドバンテージが最も小さいという情報を読みました。私の記憶によると、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/>';

}

?>

ここで私の数学に何か問題がありますか? 各セッションには山と谷がありますが、このシミュレーションでは、破綻する前に資金が 2 倍になることがよくあります。たとえそれがほんの数パーセントであっても、家が常にクラップスで有利であることを考えると、私はこの結果に困惑しています.

4

3 に答える 3

9

私は、破産する前に、クラップス (またはその他の偶然のゲーム) でお金を 2 倍にする可能性が高いことを「証明」するために書かれたコードには注意を払います。ラスベガスがネバダ州の砂漠に広がる広大な都市であることの証として、次の 2 つが挙げられます。

  1. 結局、家は常に勝つ
  2. 人々は数学が苦手です

両方のルールを活用しないカジノはありません。あなたのコードが Vegas と一致しない場合、私は自分のお金を Vegas に投資します。

アップデート:

これは、元のコードに基づいて作成した C++ です。あなたが投稿した最初の問題は、頻繁に破産する前にお金を2倍にできるかどうかでした. 私が書いたコードをフォローアップして、いくつかの結果を出しました。

#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
于 2010-02-22T17:19:14.233 に答える
5

すぐに、単純な 7 勝または 11 勝の場合に誤りがあることがわかります。賭けの 2 倍ではなく、賭けに勝つべきです。

編集:オッズ ベットの支払いは、実際の確率に見合ったものだと思います。7 をロールする (オッズを失う) 可能性は 10 よりも 2 倍高いため、4 または 10 で勝った場合は 2:1 の支払いを受ける必要があります。6 または 8 で勝った場合にのみ 6:5 を支払います。

于 2010-02-22T06:21:59.500 に答える
4

希望するオッズ ベットを行うのに十分な量がスタッシュに残っているかどうかを確認していません。実際、隠し場所のサイズをまったくチェックしていません。スタッシュ サイズがマイナスの場合でも、賭けることができれば、このシミュレーションがより頻繁に家を打ち負かすことができるのは当然のことです。

ちなみに、サイコロを 100 回投げるシミュレーションを 50,000 回実行しました (残りのスタッシュの最大賭け金を変更しました)。

勝数: 23807

損失: 25465

プッシュ ($200 を残して): 728

平均 賞金: $109.07

于 2010-02-22T17:38:30.143 に答える