Lekce 1 - 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.

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.
V další lekci, Úvod do analýzy přirozeného jazyka, si uděláme úvod do syntaktické a sémantické analýzy přirozených jazyků, spadající do oblasti umělé inteligence.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 79x (18.52 kB)
Aplikace je včetně zdrojových kódů