001    package de.hska.java.aufgaben.kontrollstrukturen;
002    
003    /**
004     * Eine "totsichere" Gewinnstrategie beim Roulettespiel ist es, immer
005     * auf die selbe Farbe zu setzen. Wenn man verloren hat, dann
006     * verdoppelt man einfach den Einsatz, um den vorherigen Verlust
007     * wieder wett zu machen.
008     * Die Wahrscheinlichkeit das immer rot (oder schwarz) kommt ist
009     * 50%  (wir ignorieren das Auftreten der 0).
010     * Diese Klasse enthält eine Methode, die berechnet wieviel Geld
011     * man ungefähr als Kapitel benötigt, wenn man 1 000 000 mal spielt 
012     * und der Anfangseinsatz ein Euro ist. Einmal spielen bedeutet
013     * solange zu setzten bis man gewonnen hat. Nach 1 000 000 Spiele hat
014     * man 1 000 000 Euro gewonnen.
015     * Die Eintreffenswahrscheinlichkeit 50% kann man mit Math.random() < 0.5
016     * überprüfen.
017     * Wie viel Geld sollten Sie mitbringen, damit Sie ihren Einsatz nicht
018     * verlieren?
019     * 
020     * <p>
021     *   <a href="http://www.home.hs-karlsruhe.de/~pach0003/informatik_1/aufgaben/kontrollanweisungen.html#roulette">Zurück zum Aufgabentext</a>
022     * </p>
023     * 
024     * 
025     * @author Christian Pape
026     */
027    public class Roulette {
028    
029        /**
030         * <p>Spielt 1 000 000 mal "Roulette" und berechnet den 
031         * maximalen Einsatz, der dabei gemacht wurde.
032         * Dieser liegt immer in der Grössenordnung des zu erhoffenden
033         * Gewinns. Aber manchmal auch das 2 bis 4 fache. Man sollte
034         * also besser 4 Mio Euro mitnehmen. 
035         * In seltenen Fällen noch mehr: in diesen Fällen ist das Geld weg,
036         * wenn man zu wenig mitgenommen hat. 
037         * </p>
038         * <p>Man könnte im Grunde auch gleich die 1 000 000 Milionen setzten
039         * und hoffen, dass man "Glück" hat. Geht wesentlich schneller.
040         * Oder bei 4 Mio, die man ohnehin schon haben sollte,
041         * lebt man besser von den Zinsen.</p>
042         * <p>Gibt bei einem Startkapital von 4 Mio aus, nach wie vielen
043         * Spielen sie pleite sein könnten.</p>
044         */
045        public static void main(String [] argv) {
046            long maximalerEinsatz = 0;
047            
048            for (int spiel = 0; spiel < 1000000; spiel++) {
049                long einsatz = 1;
050                while ( Math.random() < 0.5) {
051                    einsatz *= 2;
052                } 
053                if (einsatz > maximalerEinsatz) {
054                    maximalerEinsatz = einsatz;
055                    System.out.println("[" + spiel + "] Max. Einsatz: " + maximalerEinsatz);
056                }
057            }
058            
059            long startKapital = 1000;
060            int spiel = 0;
061            while ( startKapital > 0 ) {
062                long einsatz = 1;
063                while ( Math.random() < 0.5) {
064                    einsatz *= 2;
065                }
066                if (einsatz > startKapital) {
067                    startKapital = 0;
068                } else {
069                    startKapital++;
070                }
071                spiel++;
072            }
073            
074            System.out.println("Sie haben nach " + spiel + " Spielen kein Geld mehr");
075        }
076    }