Testování algoritmu pro podvod s ruletou

Algoritmy Ostatní Testování algoritmu pro podvod s ruletou

Každý člověk, který se pohybuje na internetu, určitě narazil na stránku, která se jej bude snažit zlákat k sázení v ruletě a ukazovat mu šanci jak se snadno stát milionářem. Na tuto stránku jsem narazil i já. Rozhodl jsem se, že bez peněz a rizika vyzkouším jak tento manuál funguje v praxi.

Spustit si online ruletu a zkoušet mi ale přišlo velmi časově náročné a proto jsem se rozhodl, že si celý test naprogramuji.

Pro programování jsem se rozhodl využít programovací jazyk Java. Na výstup bude stačit konzole. Celý program bude značně zjednodušený a bude umět pouze tento jeden experiment. Obsahuje ale určitou strukturu a tak by neměl být problém jej rozšířit a použít dál.

Třída Ruleta, která reprezentuje virtuální ruletu, vypadá takto.

public class Ruleta {
    private int padleCislo;
    private Random nahoda;

    public Ruleta(){
        nahoda = new Random();
    }

    public void zatoc(){
        this.padleCislo = nahoda.nextInt(37);
    }
    public boolean vsadNaBarvu(String barva){
        if(barva.equals(vratBarvu())){
            return true;
        }
        else{
            return false;
        }
    }
    private String vratBarvu(){
        if(padleCislo <= 18 && padleCislo != 0){
            return "cervena";
        }
        else{
            return "cerna";
        }

    }
}

Ruleta funguje následovně. Vytvoříme si její instanci. Pro zatočení ruletou zavoláme metodu zatoc(). Vygeneruje se nám náhodně číslo v intervalu <0;36>, reprezentující jednu položku rulety. Metoda vsadNaBarvu() vrací true v případě, že jsme vsadili na správnou barvu a false v případě, že jsme se mýlili. Pro zjednodušení jsem si určil, že čísla z intervalu <1;18> budou červená a čísla z intervalu <19;36> budou černá. Neodpovídá to sice pravidlům rulety, ale pravděpodobnost zůstává stejná.

Třída hra reprezentuje naši hru. Obsahuje instanci rulety a naše herní peníze.

public class Hra {

    private int penize;
    private Ruleta ruleta;
    public Hra(){
        this.penize = 1000;
        this.ruleta = new Ruleta();

    }

    public boolean vsadNaBarvu(int vsazenaCastka, String barva){
            if(this.penize < vsazenaCastka){
                return true;
            }
            this.penize -= vsazenaCastka;
            ruleta.zatoc();
            if(ruleta.vsadNaBarvu(barva)){
                this.penize += (vsazenaCastka*2);
                return true;
            }
            else{
                return false;
            }

    }

    public int vratPenize(){
        return this.penize;
    }

}

Třída obsahuje metody vsadNaBarvu() a vratPenize().

Metoda vsadNaBarvu() slouží k vsazení částky. Předáváme částku, kterou hodláme vsadit a barvu. Metoda vrací true v případě, že jsme vyhráli a false v případě, že jsme prohráli. Metoda vrací true i v případě, že nelze tolik peněz vsadit. Vysvětlím později.

Metoda vratPenize() vrací naše jmění.

A jdeme do finále. Hlavní třída našeho projektu, Ruletatest, bude provádět samotný test.

public class RuletaTest {
    Hra hra;

    public RuletaTest(){
        hra = new Hra();

        int vsazenaCastka = 10;

        while(hra.vratPenize() >= 10){
            System.out.println("Vsadil jste "+vsazenaCastka);
            if(hra.vsadNaBarvu(vsazenaCastka, "cervena")){
                vsazenaCastka = 10;
            }
            else{
                vsazenaCastka = vsazenaCastka*2;
            }
            System.out.println("A teď máte "+hra.vratPenize());
        }


    }
    public static void main(String[] args) {
        new RuletaTest();
    }
}

Celý test funguje přesně podle návodu, který můžete najít například na Google po zadání klíčových slov "Jak vyhrát v ruletě". Pokud se vám nechce hledat, tak jej naleznete tady. Návod spočívá v tom, že si na začátek zvolíme nějakou částku, kterou budeme sázet. Například 100 Kč. Když prohrajeme, tak částku zdvojnásobíme a jsme na 200kč. Když prohrajeme, tak částku zas zdvojnásobíme a jsme na 400Kč. A hle! Vyhráli jsme. Jsme v plusu.

Když se budeme striktně držet návodu, budeme postupovat asi takto. Na začátku si zvolíme vsazenou částku. V našem případě to bude 10 jednotek. V algoritmu je vsazená částka v proměnné vsazenaCastka. A nyní budeme provádět stále dokola a dokola sázecí cyklus. Budeme sázet tak dlouho, dokud budeme mít alespoň těch 10 jednotek, které jsou potřeba k minimální sázce. Napíšeme si tedy cyklus, který bude vypadat takto.

while(hra.vratPenize() >= 10){

            System.out.println("Vsadil jste "+vsazenaCastka);
            if(hra.vsadNaBarvu(vsazenaCastka, "cervena")){
                vsazenaCastka = 10;
            }
            else{
                vsazenaCastka = vsazenaCastka*2;
            }
            System.out.println("A teď máte "+hra.vratPenize());
}

Cyklus nejdříve vypíše kolik sázíme a poté tuto částku vsadí. Podle návodu sázíme stále dokola na stejnou barvu, protože jedna barva nemůže padat do nekonečna. V případě výhry musíme vsadit znovu základní částku. V případě prohry vsadíme přesně dvojnásobek vsazené částky. Takto postupujeme stále dokola. Můj algoritmus rozšiřuje původní v tom, že pokud již nemůžeme vsadit tolik peněz, tak se znovu vrátíme k výchozí částce a pokusíme se začít znovu.

Dost bylo programování, jdeme z toho dostat nějaký závěr. Když necháte proběhnout tento algoritmus, zjistíte, že se dříve nebo později dostanete na nulu. Proč to tak je? Protože pravděpodobnost prostě pracuje. Z krátkodobého hlediska se vám bude velmi dařit a peníze budou pomalu přibývat. Dříve nebo později ale nastane situace, kdy nesprávná barva prostě padne vícekrát za sebou a vy se neustálým zdvojnásobováním vsazené částky dostanete na tak vysokou částku, že ji prostě nemůžete vsadit.

Algoritmus pro podvod s ruletou

Došli jsme tedy k závěru, že tento návod je podvod a rozhodně jej nikdy nezkoušejte v praxi! Schválně si zkuste projít výsledný výpis algoritmu. Uvidíte že částka se bude slibně zvedat, a vy si budete myslet, že zkrátka nemůžete prohrát. Jak jsem ale napsal výše, pravděpodobnost začne fungovat a šance na prohru roste úměrně s počtem sázek.


 

Stáhnout

Staženo 49x (15.87 kB)
Aplikace je včetně zdrojových kódů

 

  Aktivity (1)

Článek pro vás napsal martinkobelka
Avatar

Jak se ti líbí článek?
Celkem (2 hlasů) :
4.54.54.54.54.5


 


Miniatura
Všechny články v sekci
Ostatní algoritmy

 

 

Komentáře
Zobrazit starší komentáře (4)

Avatar
Maxy_obr
Člen
Avatar
Maxy_obr:

Navíc pokud se nepletu ruleta má nuly dvě 0 a 00 takže o to je pravděpodobnost menší.

 
Odpovědět  +1 18.3.2015 19:49
Avatar
d4rkw34v3r
Člen
Avatar
Odpovídá na Maxy_obr
d4rkw34v3r:

Je více druhů rulety :-), a většinou mají pouze jednu nulu. Ale například Francouzská ruleta má nuly skutečně dvě, jak říkáš.

 
Odpovědět 18.3.2015 21:55
Avatar
coells
Redaktor
Avatar
coells:

Je to moc hezký nápad, jak pomocí simulace ověřit platnost tvrzení, bohužel, provedení je chybné.

Jak sám uvádíš, daný postup staví na principu, že "jedna barva nemůže padat do nekonečna". Jenže může. Podle klasické definice pravděpodobnosti to sice možné není, ale statistická definice takovou možnost uvažuje. To je zásadní chyba v předpokladu.

Navíc tvoje podmínky jsou hodně daleko od nekonečna. Při stavu konta 1000 a počátečním vkladu 10 přijdeš o košili už při 6 konsekutivních prohrách. Pokud vezmu v úvahu tebou nastavené podmínky, tedy pravděpodobnost prohry p=19/37 a konec hry při sekvenci r=6 proher, pak máš následující pravděpodobnosti:

pokud zatočíš ruletou 10x, prohraješ s ppstí 5.4%
pokud zatočíš ruletou 20x, prohraješ s ppstí 14%
pokud zatočíš ruletou 30x, prohraješ s ppstí 21.8%
pokud zatočíš ruletou 50x, prohraješ s ppstí 35.3%
pokud zatočíš ruletou 100x, prohraješ s ppstí 60%

Kde je chyba tvého testu? Anglicky se tomu říká anecdotal evidence, kdy na základě výjimečného jevu generalizuješ výsledky na celé universum.

Mnohem zajímavější by bylo, kdybys zkusil různá nastavení počátečního stavu konta a zkoušel měřit počet roztočení rulety, než prohraješ. Mimochodem, z dlouhodobého hlediska vždy prohraješ s nenulovou pravděpodobností, a proto se hazard nevyplácí :-P

 
Odpovědět  +2 15.4.2015 19:36
Avatar
coells
Redaktor
Avatar
coells:

Ještě mi to nedalo a podíval jsem se na web, který je zmíněný v článku, a podle kterého nelze prohrát. Nutno říct, že článek je napsaný velice profesionálně, což je vidět na už na vizuálním a gramatickém provedení. Současně ale musím varovat, že v něm jsou profesionální [a záměrné] chyby, které neodhalíte, pokud nejste trénovaný statistik.

Udělal jsem si tedy vlastní simulaci v R přesně podle návodu na webu, která není až tak odlišná od programu uvedeného v článku, i když trochu sofistikovanější a statisticky spolehlivější.

Denní zisky v prvním měsíci po dnech:

[1]  129   -3 -161 -152   -4 -135 -124 -161  111  134  137   -6  114   -8  132 -161  105 -161    7  121  130 -137 -161   -3  119 -115  123  129  122    3

Měsíční kumulativní zisky za rok:

[1] 124  -808 -1325 -3610 -3872 -5440 -4533 -5114 -6469 -5624 -6571 -7355

A protože obrázek je za tisíc slov, tak přikládám histogram denních zisků a graf kumulativních zisků za celý rok. Nezapomeňte, že jsme sázeli 1 Euro, takže hodnoty jsou v Eurech!

Závěr? Kasína nemusí podvádět, statistika se o vaši prohru sama postará! Takže Richardův verdikt o krátkozrakosti úvahy nad zelenou nulou je pouhý nedostatek ve znalostech pravděpodobnosti.

 
Odpovědět 15.4.2015 22:28
Avatar
coells
Redaktor
Avatar
Odpovídá na coells
coells:

Pardon, špatný obrázek, graf kumulativních zisků za rok, druhý pokus [a nová simulace].

 
Odpovědět 15.4.2015 23:10
Avatar
BLADE
Člen
Avatar
BLADE:

Spravil som aplikáciu na android ktorá stávkuje podľa algoritmu tejto taktiky. Na začiatku si určíte aké bude vaše maximálne konto, ďalej na čo budete vsádzať (červená čierna , 1-18...dá sa to ešte behom programu zmeniť) a potom vám to automaticky vsádza môžete meniť rýchlosť alebo si pozrieť štatistiky (na čo najviac padalo, najväčšia stávka...)

Nevyžaduje žiadne povolenia ani nemá reklamu tak sa nemusíte báť :D
https://play.google.com/…apps/details?…

 
Odpovědět  +2 21.5.2015 13:38
Avatar
Honza
Člen
Avatar
Honza:

On tento systém teoreticky funguje, ale abys měl pravděpodobnost blížící se 100% že budeš minimálně na nule, musejí být splněny dvě podmínky, přičemž druhá z nich nebude splněna nikdy.

  1. nesmí být omezena horní hranice sázky
  2. musíš disponovat neomezenými prostředky pro vklad

Pokud budeš moct donekonečna zvyšovat sázky, dříve nebo později padne barva na kterou sázíš. To se ale v praxi samozřejmě nikdy nestane, nemluvě o tom že kdyby jsi měl tolik prostředků, neměl bys důvod je cpát do rulety :)
Problém je prostě v tom, že s každou prohranou sázkou staršně strmě roste tvůj vklad. Je to stejný jako ten příběh se šachovnicí a zrnky rýže.
Nemluvě o tom že v online kasínech může být implementován mechanismus který "hraje" proti tobě, takže ti může šanci značně snížit nebo i velkou výhru znemožnit.

Další věcí je, že při ruletě je pravděpodobnost "na tvé straně" pouze při krátkodobém hraní. Čím déle hraješ, tím větší výhoda pro kasíno. Provozovatelé online kasín to ale samozřejmě vědí, takže mají téměř vždy v podmínkách, že svůj vklad musíš několikrát protočit aby ti ho vyplatili. Čímž samozřejmě docílí toho že musíš hrát déle a pak už není co vyplácet.

Editováno 21.5.2015 14:47
Odpovědět 21.5.2015 14:43
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Petr Stastny
Redaktor
Avatar
Petr Stastny:

Tak to nevím... Naprogramoval jsem si na to vlastní program a s 1000 hned prohraju, ale s 10 000 jsem vydržel, až mi spadnul program :-)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RulTEST
{
    class Ruleta
    {
        public int penize;
        private int zaklad = 10;
        private int sazka;
        Random rnd = new Random();
        private int kolo;

        public Ruleta(int penize)
        {
            this.penize = penize;
            sazka = zaklad;
        }

        public void Toc()
        {
            int Hod = rnd.Next(37);
            if(Hod <= 18)
            {
                penize -= sazka;
                Console.WriteLine("[KOLO {0}: PROHRA] Vsadil jsi {1} a ted mas {2} penez",kolo, sazka, penize);
                sazka = sazka * 2;
                if (sazka > penize)
                    sazka = penize;
                if (penize <= 0)
                {
                    Console.WriteLine("KONEC HRY, PROHRAL JSI");
                    Console.ReadKey();
                }
                else
                {
                    kolo++;
                    Toc();
                }
            }else
            {
                penize += sazka;
                Console.WriteLine("[KOLO {0}: VYHRA] Vsadil jsi {1} a ted mas {2} penez",kolo, sazka, penize);
                sazka = zaklad;
                kolo++;
                Toc();
            }


        }
    }
}
Editováno 27. dubna 18:48
 
Odpovědět 27. dubna 18:45
Avatar
Petr Stastny
Redaktor
Avatar
Odpovídá na Petr Stastny
Petr Stastny:

Edit: Byla tam chyba, odstranil jsem ji a upravil zdrojak nahore. Omlouvam se za spam ☺

 
Odpovědět 27. dubna 20:40
Avatar
coells
Redaktor
Avatar
Odpovídá na Petr Stastny
coells:

Místo kódu Toc() si dej return true, místo Console.ReadKey() dej return false a volej metodu přes while (Toc()) ;
Tím se vyhneš přetečení zásobníku.

No a pak si vyzkoušej několik spuštění, ať vidíš, jak rychle prohraješ.
Při vyšší částce je jen nižší pravděpodobnost prohry, ale ta časem roste.

 
Odpovědět  +1 27. dubna 23:09
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 14. Zobrazit vše