Czy można oszukać kasyno?

casino_head
Analiza danych Prawdopodobieństwo Statystyka
2022-09-26

Istnieje przekonanie, że można wygrać w ruletkę stosując bardzo prostą metodę – przy każdej przegranej podwajamy stawkę i dzięki temu możemy „przechytrzyć” ruletkę 🤑. Niesamowicie zaciekawiło mnie to podejście i postanowiłam to sprawdzić za pomocą symulacji statystycznej. Ciekawy_a rezultatów? Zapraszam do lektury! 👇👇👇👇

Zacznijmy od szczegółowego opisania systemu:

  1. Wybierz kolor na który będziesz stawiać przez cały czas – czerwony albo czarny.
  2. Wybierz stawkę początkową i postaw ją na wybrany przez siebie kolor.
  3. Jeśli przegrasz, podwój stawkę i postaw na ten sam kolor. Jeśli wygrasz, zacznij od nowa i postaw zakład za taką samą kwotę jak na początku.
  4. Za każdym razem, kiedy wygrasz, odbierz wygraną i postaw początkową sumę na kolor, który wybierzesz.

Warto nadmienić, że grę musimy skończyć po wygranej (niekoniecznie po pierwszej). W przeciwnym razie narażamy się na straty. Grając opisaną metodą każda wygrana zapewni nam pokrycie wszystkich dotychczasowych strat. Oczywiście może się też zdarzyć tak, że X razy z rzędu przegramy i tym samym przegramy cały posiadany kapitał. Poniższa analiza pomoże nam ustalić jakie są szanse na wygraną taką metodą oraz jakiego rzędu zysków możemy się spodziewać.

Symulacja

Zdefiniujmy w Pythonie symulator opisanego podejścia. Na początek wprowadzane informacje:

  • n_games – Liczba gier, które docelowo chcemy rozegrać.
  • chosen_color – Wybrany kolor.
  • start_money – Łączna pula pieniędzy jaką posiadamy.
  • rate – Stopa zwrotu (w przypadku ruletki będzie wynosić 2, bo szansa wygranej to 1/2).
  • first_game_money – Kwota pierwszego zakładu.
class CasinoSimulator:
    """
    Simulator of the bet approach assuming that you should double bet value if you loose to achieve profit
    in game in which change for the win is 50%.
    """

    def __init__(self, n_games, chosen_color, start_money, rate, first_game_money):
        """Parameters
        ---------------------------------------------
        :param n_games: Number of games to play. When ths number achieved game is finished after first win.
        :param chosen_color: Color for bet - black or red.
        :param start_money: Money the gamer has at the beginning.
        :param rate: Rate of return.
        :param first_game_money: Money to bet in first game.
        """
        self.chosen_color = chosen_color
        self.current_money = start_money
        self._n_games = n_games
        self._start_money = start_money
        self._rate = rate
        self._first_game_money = first_game_money

    @property
    def n_games(self):
        return self._n_games

    @property
    def start_money(self):
        return self._start_money

    @property
    def rate(self):
        return self._rate

    @property
    def first_game_money(self):
        return self._first_game_money

Zdefiniujmy teraz metodę symulującą pojedynczy zakład. Wprowadzamy do niej 3 informacje (te które przy każdym zakładzie mogą być różne):

  • color – Kolor, który się wylosował.
  • won_money – Pieniądze wygrane od początku do chwili obecnej.
  • one_game_money – Wysokość zakładu w aktualnej grze.

Jeżeli wylosowany kolor jest zgodny z tym co obstawiliśmy, to dodajemy wartość zakładu do naszej wygranej i wartość pojedynczego zakładu zmieniamy na wartość początkową. W przeciwnym razie odejmujemy z naszej puli wartość zakładu i zwiększamy dwukrotnie wartość zakładu na kolejną grę.

    def one_bet(self, color, won_money, one_game_money):
        """Provide results for one bet.

        :param color: Sampled color.
        :param won_money: Money won until current bet.
        :param one_game_money: Bet value in current game.
        :return: Money after bet, Bet value for next bet.
        """

        if color != self.chosen_color:
            won_money -= one_game_money
            one_game_money *= self._rate
        else:
            won_money += one_game_money
            one_game_money = self._first_game_money
        current_money = self._start_money + won_money

        return current_money, one_game_money

Następnie musimy przygotować symulację gry pojedynczego gracza. Zasady obstawiania zakładów już znamy. Tu ważny jest jedynie fakt, że mamy ustaloną liczbę gier. Jak rozegramy tyle gier, to kończymy grę przy pierwszej wygranej. Chyba, że w ostatniej grze wygraliśmy, to kończymy natychmiast.

    def single_game_simulation(self, play_till_win=True):
        """One game simulation for one gamer.

        :param play_till_win: If True player finishes game when first win after minimum number of bets.
        :return: Money player have after game.
        """
        won_money = 0
        self.current_money = self._start_money
        one_game_money = self._first_game_money

        for i in range(self._n_games):
            color = np.random.choice(["black", "red"])
            self.current_money, one_game_money = self.one_bet(color, won_money, one_game_money)

            if self.current_money < 0:
                return 0

        if color != self.chosen_color and play_till_win:
            while color != self.chosen_color:
                color = np.random.choice(["black", "red"])
                self.current_money, one_game_money = self.one_bet(color, won_money, one_game_money)

        return self.current_money

W ten sposób osiągnęliśmy pełną symulację gry dla pojedynczego gracza. Oczywiście wynik jednego gracza nie może być dowodem słuszności / niesłuszności proponowanego rozwiązania. Dlatego zasymulujemy grę dla 1000 graczy i przeprowadzimy bardzo prostą analizę statystyczną ich wyników.

Jeżeli chcesz zajrzeć w pełny kod / odtworzyć go, jest on dostępny na moim githubie: https://github.com/kingagla/casino_simulator.

Analiza statystyczna

Przyjmijmy kilka założeń:

  • Liczba graczy to 1000, co oznacza 1000 symulacji gry dla pojedynczego gracza.
  • Aby osiągnąć jak najszerszy pogląd potencjalnych efektów takiej taktyki rozważymy 16 możliwości:
    • Cztery potencjalne liczby gier (ile minimum gier każdy zawodnik musi rozegrać, po rozegraniu odpowiedniej liczby zawodnik kończy grę przy pierwszej wygranej).
    • Cztery potencjalne stawki początkowe.
    • Rozważając wszystkie możliwe połączenia tych dwóch zmiennych otrzymamy 16 możliwości.
  • Dla uproszczenia obliczeń każdy gracz przyjmuje kolor czarny jako ten na który będzie obstawiać.
  • Każdy przychodzi do kasyna z 1000 monet.

Warto dodatkowo dodać, że otrzymany rozkład wygranej zdecydowanie NIE JEST symetryczny. Tym samym lepszym odpowiednikiem wartości oczekiwanej (czyli ile wygranej należy się spodziewać) będzie mediana wygranych.

Spójrzmy zatem na tabelę opisującą wygrane. Najpierw najbardziej podstawowe statystyki podsumowujące. Przypomnijmy również, że mediana (kolumna 50%) to oczekiwana wartość wygranej. Ostatnia kolumna wskazuje na szansę przegranej – czyli stracenia kwoty początkowej (1000 monet).

countmeanstdmin50%maxloose_chance
n_games_50_first_money_1001000,0-180,21606,4-1000,0-1000,025600,00,55
n_games_100_first_money_501000,0-309,01100,9-1000,0-1000,012800,00,562
n_games_100_first_money_1001000,0-533,92345,6-1000,0-1000,051200,00,819
n_games_10_first_money_101000,0210,61571,1-1000,020,040960,00,006
n_games_30_first_money_101000,01482,641478,0-1000,020,01310720,00,042
n_games_50_first_money_101000,068,2872,4-1000,020,020480,00,073
n_games_100_first_money_101000,0-6,31581,7-1000,020,040960,00,18
n_games_10_first_money_201000,02819,582899,9-1000,040,02621440,00,013
n_games_30_first_money_201000,0169,52026,5-1000,040,040960,00,085
n_games_50_first_money_201000,046,91070,5-1000,040,020480,00,171
n_games_100_first_money_201000,0-186,7719,7-1000,040,05120,00,303
n_games_10_first_money_501000,0575,72705,7-1000,0100,051200,00,047
n_games_30_first_money_501000,01994,151953,3-1000,0100,01638400,00,2
n_games_30_first_money_1001000,0271,93701,2-1000,0100,0102400,00,386
n_games_50_first_money_501000,0465,17406,3-1000,0100,0204800,00,319
n_games_10_first_money_1001000,01009,06298,6-1000,0200,0102400,00,122
min10%25%50%75%85%95%99%max
n_games_50_first_money_100-1000,0-1000,0-1000,0-1000,0200,0400,01600,06400,025600,0
n_games_100_first_money_50-1000,0-1000,0-1000,0-1000,0100,0200,0800,03200,012800,0
n_games_100_first_money_100-1000,0-1000,0-1000,0-1000,0-1000,0200,0800,03200,051200,0
n_games_10_first_money_10-1000,010,010,020,080,0160,0640,02560,040960,0
n_games_30_first_money_10-1000,010,010,020,080,0160,0640,02560,01310720,0
n_games_50_first_money_10-1000,010,010,020,080,0160,0336,02560,020480,0
n_games_100_first_money_10-1000,0-1000,010,020,080,0160,0640,01280,040960,0
n_games_10_first_money_20-1000,020,020,040,0160,0320,0640,02560,02621440,0
n_games_30_first_money_20-1000,0-1000,020,040,0160,0320,0640,02560,040960,0
n_games_50_first_money_20-1000,0-1000,020,040,080,0160,0640,02585,620480,0
n_games_100_first_money_20-1000,0-1000,0-1000,040,080,0160,0640,01280,05120,0
n_games_10_first_money_50-1000,050,050,0100,0400,0800,01600,012800,051200,0
n_games_30_first_money_50-1000,0-1000,050,0100,0400,0800,01600,06400,01638400,0
n_games_30_first_money_100-1000,0-1000,0-1000,0100,0400,0800,01600,06400,0102400,0
n_games_50_first_money_50-1000,0-1000,0-1000,0100,0200,0400,01600,06464,0204800,0
n_games_10_first_money_100-1000,0-1000,0100,0200,0800,0800,03200,012800,0102400,0

Zauważmy, że najbezpieczniejszą opcją (najmniejsza szansa stracenia wszystkich pieniędzy i tym samym największa szansa wygrania jakichkolwiek pieniędzy) to rozegranie 10 gier ze stawką początkową 10. Prawdopodobieństwo przegranej wynosi jedynie 0.5%. W takiej opcji oczekiwana wartość wygranej to 20 monet, czyli mamy 2% stopę zwrotu przy dziesięciu rozegranych grach. W takiej opcji mamy 5% szansy na wygranie 640 monet – co jest ponad połową tego co obstawiliśmy. Taka opcja wydaje się być całkiem nie najgorsza, ale czy to jest warte zachodu oraz czy gracze rzeczywiście obstawiają tylko 10 gier i na tym kończą? Nie znam się, więc się nie wypowiem 🤷‍♀️🤷‍♀️🤷‍♀️

Najlepszej wygranej, bo aż 200 monet możemy się spodziewać rozgrywając 10 gier, ale obstawiając 100 jako minimalną stawkę. W takiej opcji mamy jednak aż 12% szans na utratę wszystkiego. Wydaje się to być całkiem sporym ryzykiem.

Patrząc na oczekiwaną wartość wygranej w stosunku do szansy przegrania, najbardziej optymalną opcją wydaje się być opcja rozegrania 10 gier przy minimalnej stawce 50. Wtedy mamy 5% szans na przegraną, ale oczekiwana wartość zwrotu to 10%. Poza tym grając tą taktyką regularnie średnio raz na 20 razy powinniśmy wygrać aż 1600, ale też raz na 20 razy przegramy kapitał.

Rozkład wygranych bez uwzględniania 5% najwyższych wygranych

Warto jeszcze dodać jedną istotną obserwację. Taką metodą NIE MOŻNA rozgrywać zbyt wielu gier ani zbyt wysokimi stawkami. Wszystkie strategie, w których najniższa stawka wynosi 100 (10% kapitału) mają szansę przegranej powyżej 10%. Również rozegranie zbyt wielu gier oznacza dużą szansę na przegraną lub niewielką oczekiwaną wygraną (zwłaszcza w odniesieniu do tego ile czasu trzeba byłoby poświęcić na rozegranie aż tylu gier).

Podsumowanie

Z przeprowadzonych symulacji wynika, że z całkiem sporym prawdopodobieństwem można wygrać taką metodą. Jednak wówczas oczekiwaną wygraną będzie 2% kapitału, który zaryzykowaliśmy. Jeżeli chcemy wygrać wyższe kwoty przy takim podejściu, to musimy się niestety liczyć z wysokim ryzykiem straty 🤷‍♀️.

Moim zdaniem w wersji „ostrożnej” czas poświęcony na grę, zaangażowanie itp. są nieopłacalne w stosunku do tego ile możemy wygrać. W pozostałych opcjach z kolei ryzyko jest (jak dla mnie) za duże. A Ty co sądzisz? 🤔🤔 Koniecznie daj znać w komentarzu jakie jest Twoje zdanie i czy uważasz, że jest to „gra warta świeczki”?

guest
3 komentarzy
Najnowsze
Najstarsze Najczęściej oceniane
Zobacz wszystkie komentarze
Marek
Gość
Marek
2 miesięcy temu

Bardzo fajna analiza, jestem początkujący w tych tematach i z zaciekawieniem czytam wszelkie analizy. Nie mniej jednak tak jak kolega powyżej napisał jestem przekonany że gry losowe/liczbowe są już tak ustawione że strategie polegające na prawdopodobieństwie dziś już nie mają szans.
Jednak wpis wartościowy, jasno przedawilaś to zagadnienie

Dawid
Gość
Dawid
2 miesięcy temu

Hej, bardzo fajnie to wszystko opisane. W ruletce jest jeszcze pole zielone 0, czyli prawdopodobieństwo wylosowania czerwonego czy czarnego pola nie jest 1/2.

Wielbiciel Matematyki
Gość
Wielbiciel Matematyki
2 miesięcy temu

To ja tylko powiem, że dzisiaj chyba wszystkie kasyna (tak jak lotto i inne gry losowe) polegają na schematach matematycznych, które badają kiedy właściciel dostanie najwięcej kasy.
W PRLu w lotto szóstka trafiała się dużo częściej. Dzisiaj to już jest tak przekręcone, że taka wygrana trafia się raz na pół roku. Może kiedys dało się oszukać kasyna i teoretycznie oszukać los. Dzisiaj po prostu nie warto bawić się w kasynach, bo to przeciez oni muszą na tym zarobić…