Kapitel 5 · Statistik: das Ende jeglicher Intuition

Roulette in Python – und warum Verdoppeln nicht funktioniert

Erst spielst du: Zahl und Farbe setzen, die Kugel rollt. Dann übernimmt der Computer mit einer beliebten »todsicheren« Strategie – nach einer Serie auf die andere Farbe setzen und nach jedem Verlust verdoppeln. Das Budget-Diagramm zeigt, was davon zu halten ist.

Aus dem Buch · Kapitel 5 Einsteiger SimulationSpiele Python 3 · läuft im Browser
Bereit · Python startet beim ersten Klick
# Roulette – Kapitel 5 »Statistik: das Ende jeglicher Intuition«
# aus »Coding for Fun mit Python«, portiert auf Python 3 und c4f.
# Roulette.py (du spielst) und AutomatedRoulette.py (der Computer
# spielt eine Verdopplungsstrategie) sind hier vereint.
import math
import random
from c4f import Screen, ask, KEYDOWN

# --- Teil 1: Du spielst (Roulette.py) --------------------------------------

async def readInput(prompt=""):
    guess = await ask(prompt)  # statt raw_input(): Eingabe in der Konsole
    number = -1
    if guess != '':
        try:
            number = int(guess)
        except Exception as arg:
            print("no valid number", arg)

    return number


async def askForBet(number):
    bet = 0
    if number != -1:
        bet = await readInput("Your bet: ")

    return bet


def checkReality():
    realityNumber = random.randint(0, 36)
    if realityNumber % 2 == 0:
        if realityNumber == 0:
            realityColor = 3  # 3 == green
        else:
            realityColor = 1  # 1 == red
    else:
        realityColor = 2  # 2 == black

    return realityNumber, realityColor


def calculateBudget(budget, number, numberBet, color, colorBet, realityNumber, realityColor):
    if number != -1:
        budget -= numberBet
        if number == realityNumber:
            budget += numberBet * 36  # 35 times plus bet which was taken
            print(budget, "number")

    if color != -1:
        budget -= colorBet
        if color == realityColor:
            budget += colorBet * 2

    return budget


def showReality(realityNumber, realityColor, budget):
    colorDef = {2: "black", 1: "Red", 3: "Green"}
    print()
    print("number:\t", realityNumber)
    print("color:\t", colorDef.get(realityColor))
    print("budget:\t", budget)


# --- Der Roulettetisch im Bild (neu im Browser) ---------------------------
W, H     = 640, 400
CENTER   = (195, 200)
RADIUS   = 160
FELT     = (12, 84, 52)
CREAM    = (246, 238, 220)
MUTED    = (160, 200, 175)
COLORS   = {1: (200, 32, 44), 2: (28, 28, 34), 3: (22, 150, 80)}
NAMES    = {1: "rot", 2: "schwarz", 3: "grün"}


def pocketColor(number):
    # dieselbe Regel wie in checkReality: gerade rot, ungerade schwarz, 0 grün
    if number == 0:
        return COLORS[3]
    return COLORS[1] if number % 2 == 0 else COLORS[2]


def pocketAngle(number):
    return 2 * math.pi * number / 37 - math.pi / 2  # die 0 liegt oben


def drawWheel(ballAngle=None):
    cx, cy = CENTER
    step = 2 * math.pi / 37
    screen.circle(CENTER, RADIUS + 14, (96, 60, 30))          # Holzrand
    for n in range(37):
        a0 = pocketAngle(n) - step / 2
        points = [CENTER]
        for k in range(4):
            a = a0 + step * k / 3
            points.append((cx + math.cos(a) * RADIUS, cy + math.sin(a) * RADIUS))
        screen.polygon(points, pocketColor(n))
        a = pocketAngle(n)
        screen.text(str(n), (cx + math.cos(a) * (RADIUS - 16), cy + math.sin(a) * (RADIUS - 16)),
                    CREAM, size=11, align="center", baseline="middle")
    screen.circle(CENTER, RADIUS * 0.55, (86, 54, 28))         # Innenteil
    screen.circle(CENTER, RADIUS * 0.14, (212, 178, 96))
    if ballAngle is not None:
        r = RADIUS - 36
        screen.circle((cx + math.cos(ballAngle) * r, cy + math.sin(ballAngle) * r), 8, (250, 250, 250))


def drawTable(budget, results, ballAngle=None):
    screen.clear(FELT)
    drawWheel(ballAngle)
    x = 398
    screen.text("BUDGET", (x, 28), MUTED, size=14, bold=True)
    screen.text(f"{budget} $", (x, 48), CREAM, size=38, bold=True)
    screen.text("LETZTE ZAHL", (x, 112), MUTED, size=14, bold=True)
    if results:
        number, color = results[-1]
        screen.circle((x + 32, 166), 30, COLORS[color])
        screen.text(str(number), (x + 32, 166), CREAM, size=26, align="center", baseline="middle", bold=True)
        screen.text(NAMES[color], (x + 76, 166), CREAM, size=20, baseline="middle")
    screen.text("VERLAUF", (x, 216), MUTED, size=14, bold=True)
    for i, (number, color) in enumerate(results[-8:]):
        screen.circle((x + 12 + i * 28, 250), 12, COLORS[color])
        screen.text(str(number), (x + 12 + i * 28, 250), CREAM, size=11, align="center", baseline="middle")
    for i, line in enumerate(["Setzen in der Konsole unten:", "Zahl, Einsatz, Farbe, Einsatz.",
                              "Leere Eingabe = nicht setzen."]):
        screen.text(line, (x, 300 + i * 22), MUTED, size=14)


async def spinWheel(budget, results, number):
    """Neu im Browser: Die Kugel rollt und bleibt auf der gezogenen Zahl liegen."""
    start = random.uniform(0, 2 * math.pi)
    total = 3 * 2 * math.pi + (pocketAngle(number) - start) % (2 * math.pi)
    frames = 45
    for f in range(frames + 1):
        t = f / frames
        drawTable(budget, results, start + total * (1 - (1 - t) ** 3))
        await screen.frame(40)


async def playRoulette():
    results = []
    print("Welcome to Las Vegas!")
    budget = 20
    drawTable(budget, results)

    while True:
        print()
        number    = await readInput("Choose a number: ")
        numberBet = await askForBet(number)

        color     = await readInput("Red(1) or Black(2): ")
        colorBet  = await askForBet(color)

        if number == -1 and color == -1:
            break

        realityNumber, realityColor = checkReality()
        await spinWheel(budget, results, realityNumber)
        budget = calculateBudget(budget, number, numberBet, color, colorBet, realityNumber, realityColor)
        showReality(realityNumber, realityColor, budget)
        results.append((realityNumber, realityColor))
        drawTable(budget, results, pocketAngle(realityNumber))

        if budget <= 0:
            break

    print()
    print("Congratulations your budget is:", budget, "Dollar")
    print("Ciao!")


# --- Teil 2: Der Computer spielt (AutomatedRoulette.py) --------------------

def calculateColorBudget(budget, color, colorBet, realityNumber, realityColor):
    if color != -1:
        budget -= colorBet
        if color == realityColor:
            budget += colorBet * 2

    return budget


LEFT, RIGHT, TOP, BOTTOM = 84, 606, 74, 336
DARK, GRID, TEXT, GOLD   = (16, 18, 24), (48, 53, 66), (228, 231, 238), (245, 200, 75)


def drawBudgetChart(history, games, startBudget):
    screen.clear(DARK)
    top = max(max(history), startBudget) * 1.15
    bottom = min(0, min(history))

    def toX(i):
        return LEFT + (RIGHT - LEFT) * i / games

    def toY(value):
        return BOTTOM - (BOTTOM - TOP) * (value - bottom) / (top - bottom)

    screen.line((LEFT, toY(0)), (RIGHT, toY(0)), GRID, 1)
    screen.text("0 $", (LEFT - 10, toY(0)), (150, 157, 172), size=14, align="right", baseline="middle")
    y = toY(startBudget)
    for x in range(LEFT, RIGHT, 14):
        screen.line((x, y), (min(x + 7, RIGHT), y), (150, 157, 172), 1)
    screen.text(f"{startBudget} $", (LEFT - 10, y), (150, 157, 172), size=14, align="right", baseline="middle")

    step = max(1, games // 1000)  # höchstens rund 1000 Punkte
    points = [(toX(i), toY(v)) for i, v in enumerate(history) if i % step == 0]
    points.append((toX(len(history) - 1), toY(history[-1])))
    if len(points) > 1:
        screen.lines(points, GOLD, 2)

    budget = history[-1]
    screen.text(f"Spiel {len(history) - 1} von {games}", (LEFT, 20), TEXT, size=22, bold=True)
    screen.text(f"Budget: {budget} $", (RIGHT, 20), GOLD if budget > 0 else (255, 110, 100),
                size=22, align="right", bold=True)
    screen.text("Verdopplungsstrategie: nach vier gleichen Farben dagegen setzen",
                (LEFT, 50), (150, 157, 172), size=14)
    if budget <= 0:
        screen.text("Pleite!", ((LEFT + RIGHT) / 2, (TOP + BOTTOM) / 2), (255, 110, 100),
                    size=48, align="center", baseline="middle", bold=True)
    screen.text("Spiele", ((LEFT + RIGHT) / 2, BOTTOM + 12), (150, 157, 172), size=14, align="center")


async def automatedRoulette():
    print()
    print("Welcome to Las Vegas!")
    budget = 2000  # Startkapital des Computers
    startBudget = budget

    lastColor           = 0
    howManyTimes        = 0
    lossCounter         = 0
    numberOfGamesToPlay = 1000
    games               = numberOfGamesToPlay
    history             = [budget]   # neu: für das Diagramm
    biggestBet          = 0
    while numberOfGamesToPlay > 0:
        numberOfGamesToPlay -= 1

        if howManyTimes >= 3 and lastColor != 3:
            if lastColor == 1:
                color = 2
            else:
                color = 1

            colorBet = 5 * (2 ** lossCounter)
        else:
            color    = 0
            colorBet = 0

        realityNumber, realityColor = checkReality()
        budget = calculateColorBudget(budget, color, colorBet, realityNumber, realityColor)

        if realityColor != color and colorBet != 0:
            lossCounter += 1
        else:
            lossCounter = 0

        if lastColor == realityColor:
            howManyTimes += 1
        else:
            howManyTimes = 0

        lastColor = realityColor

        history.append(budget)
        biggestBet = max(biggestBet, colorBet)
        if len(history) % 10 == 0:
            drawBudgetChart(history, games, startBudget)
            await screen.frame(60)

        if budget <= 0:
            break

    drawBudgetChart(history, games, startBudget)
    print()
    print("Congratulations your budget is:", budget, "Dollar")
    print("Ciao!")
    print(f"Gespielt: {len(history) - 1} Spiele, höchster Einsatz: {biggestBet} Dollar")


screen = Screen(W, H, background=FELT, title="Roulette")
await playRoulette()
screen.controls([("n", "Noch eine Nacht")])
await automatedRoulette()
while True:
    for event in screen.events():
        if event.type == KEYDOWN and event.key == "n":
            await automatedRoulette()
    await screen.frame(30)
Roulettetisch: Rad mit roten, schwarzen und grüner Zahl auf grünem Filz, daneben das Budget von 20 Dollar

Du setzt in der Konsole unter dem Bild. Zweimal Enter ohne Eingabe beendet dein Spiel, dann spielt der Computer.

Konsole

    

Was du hier lernst

  • Zufallszahlen mit random
  • Eingaben mit await ask()
  • Fehler abfangen mit try/except
  • Wahrscheinlichkeit und Erwartungswert
  • Verdopplungsstrategie (Martingale)
  • Diagramm selbst zeichnen

So funktioniert die Simulation

Das Programm hat zwei Teile. Im ersten spielst du selbst: Du setzt in der Konsole auf eine Zahl, eine Farbe oder beides, und die Kugel entscheidet. Im zweiten übernimmt der Computer und spielt 1000 Runden nach einer Strategie, die auf den ersten Blick unschlagbar wirkt. Beides zusammen zeigt, wie leicht sich die Intuition beim Glücksspiel täuschen lässt.

1. Setzen in der Konsole

Jede Eingabe läuft über readInput. Die Funktion wartet mit await ask(...) auf eine Zeile und versucht, daraus eine ganze Zahl zu machen:

guess = await ask(prompt)
number = -1
if guess != '':
    try:
        number = int(guess)
    except Exception as arg:
        print("no valid number", arg)

Eine leere Eingabe ergibt −1, und −1 bedeutet »ich setze nicht«. Tippst du etwas, das keine Zahl ist, fängt try/except den Fehler ab, statt das Programm abstürzen zu lassen. askForBet fragt nur dann nach einem Einsatz, wenn wirklich gesetzt wurde. Lässt du Zahl und Farbe leer, endet dein Spiel.

2. Der Zufall entscheidet

checkReality zieht mit random.randint(0, 36) eine der 37 Zahlen – jede gleich wahrscheinlich. Die Farbe ergibt sich aus einer vereinfachten Regel: gerade Zahlen sind rot, ungerade schwarz, die 0 ist grün.

if realityNumber % 2 == 0:
    if realityNumber == 0:
        realityColor = 3  # 3 == green
    else:
        realityColor = 1  # 1 == red
else:
    realityColor = 2  # 2 == black

Farben als Zahlen 1, 2 und 3 heißen »magische Zahlen«: Man muss sich merken, was sie bedeuten. Die Kommentare helfen, eine Konstante wie RED = 1 wäre noch klarer. Auf einem echten Kessel sind übrigens andere Zahlen rot, an den Chancen ändert das aber nichts – es bleiben 18 rote, 18 schwarze und eine grüne.

3. Gewinn und Verlust

calculateBudget zieht erst die Einsätze ab und zahlt dann aus. Eine richtige Zahl bringt das 36-Fache des Einsatzes zurück, also 35-mal Gewinn plus den Einsatz. Eine richtige Farbe verdoppelt den Einsatz:

budget -= colorBet
if color == realityColor:
    budget += colorBet * 2

Neu im Browser: Während die Konsole wartet, zeigt das Bild einen Roulettetisch. Die Kugel rollt über das Rad und bleibt auf der gezogenen Zahl liegen, daneben stehen dein Budget und die letzten Ergebnisse.

4. Warum die Bank gewinnt

Setzt du auf Rot, gewinnst du bei 18 von 37 Zahlen, also in rund 48,6 Prozent der Fälle. Die grüne Null gehört niemandem – außer der Bank. Pro gesetztem Dollar verlierst du deshalb im Durchschnitt 1/37, rund 2,7 Cent. Bei einer einzelnen Zahl ist es genauso: Sie kommt in einem von 37 Fällen, als Gewinn gibt es aber nur das 35-Fache des Einsatzes.

Die Kugel hat kein Gedächtnis

Nach vier Mal Rot fühlt sich Schwarz »fällig« an. Das ist ein bekannter Denkfehler, der Spielerfehlschluss. Jede Runde ist unabhängig von der vorigen, Schwarz kommt weiterhin in 18 von 37 Fällen – egal, was vorher kam.

5. Der Computer verdoppelt

Im zweiten Teil wartet der Computer, bis viermal hintereinander dieselbe Farbe kam. howManyTimes zählt die Wiederholungen: Beim ersten Mal ist der Zähler 0, nach der vierten gleichen Farbe steht er auf 3. Dann setzt der Computer auf die andere Farbe – und verdoppelt nach jedem Verlust:

if howManyTimes >= 3 and lastColor != 3:
    ...
    colorBet = 5 * (2 ** lossCounter)

lossCounter zählt die Verluste in Folge. Die Einsätze wachsen also 5, 10, 20, 40, 80 … Dollar. Die Idee dahinter: Irgendwann kommt die richtige Farbe, und dann holt ein einziger Gewinn alle Verluste zurück, plus 5 Dollar.

6. Was das Diagramm zeigt

Die goldene Linie zeigt das Budget nach jedem Spiel. Meist steigt sie langsam in kleinen Stufen – die Strategie scheint zu funktionieren. Dann kommt eine lange Pechsträhne: Nach acht Verlusten in Folge steht schon ein Einsatz von 1280 Dollar im Raum, mehr als der Computer noch hat. Weil das Programm den Einsatz nicht auf das vorhandene Geld begrenzt, kann das Budget dabei sogar ins Minus rutschen.

Wir haben die Nacht 20 000-mal simuliert: Gut vier von fünf Nächten enden mit Gewinn, etwa jede elfte mit der Pleite. Über alle Nächte gerechnet verliert der Computer trotzdem Geld. Viele kleine Gewinne und wenige große Verluste – genau das macht die Strategie so verführerisch.

Die Bank spielen

Das Programm prüft nicht, ob ein Einsatz positiv ist. Setzt du einen negativen Betrag, drehen sich Gewinn und Verlust um: Du spielst die Bank. Am besten auf eine einzelne Zahl – dann gewinnst du meistens, und ab und zu wird es richtig teuer.

Weiterlesen: Monte-Carlo-Simulation

Ein Zufallsexperiment tausendfach durchspielen und die Ergebnisse auszählen – so wie hier die 20 000 Roulette-Nächte – nennt man Monte-Carlo-Simulation. Wie die Methode funktioniert und wie genau ihre Ergebnisse sind, erklärt smartlytics.de.

Probier mal

Jede Variante ändert den Code oben. Ein Klick auf »Ausprobieren« übernimmt die Änderung in den Editor und startet das Programm. »Zurücksetzen« holt das Original zurück.

  1. 01Der Computer mit 20 Dollar

    Gib dem Computer nur das Budget, mit dem du selbst angefangen hast. Nach zwei verlorenen Einsätzen (5 und 10 Dollar) bleiben ihm noch 5 Dollar, der dritte Einsatz verlangt schon 20. In unseren Testläufen ging er so in fast neun von zehn Nächten pleite.

    - budget = 2000  # Startkapital des Computers
    + budget = 20  # Startkapital des Computers
  2. 02Mit Tischlimit

    Echte Kasinos begrenzen den Einsatz – das Buch schlägt vor, genau das auszuprobieren. Mit 500 Dollar Limit kann der Computer nach einer langen Pechsträhne seine Verluste nicht mehr zurückholen. Er geht seltener pleite, beendet die Nacht aber öfter mit weniger Geld, als er mitgebracht hat.

    -             colorBet = 5 * (2 ** lossCounter)
    +             colorBet = min(5 * (2 ** lossCounter), 500)  # Tischlimit
  3. 03Eine lange Nacht: 10 000 Spiele

    Je länger gespielt wird, desto sicherer kommt irgendwann die Serie, die alles vernichtet. In unseren Testläufen endete ungefähr jede zweite Nacht mit 10 000 Spielen in der Pleite.

    - numberOfGamesToPlay = 1000
    + numberOfGamesToPlay = 10000
    -         if len(history) % 10 == 0:
    +         if len(history) % 100 == 0:
  4. 04Nicht auf Serien warten

    Das Warten auf vier gleiche Farben ist Aberglaube: Die Kugel hat kein Gedächtnis, jeder Einsatz gewinnt in 18 von 37 Fällen. Hier setzt der Computer bei jedem Spiel gegen die letzte Farbe. Pro Einsatz ändern sich die Chancen nicht – aber er setzt viel öfter, und die zerstörerische Pechsträhne kommt schneller. In unseren Testläufen ging er in gut vier von zehn Nächten pleite.

    -         if howManyTimes >= 3 and lastColor != 3:
    +         if lastColor != 3 and lastColor != 0:
  5. 05Ein echter Roulettekessel

    Im Buch sind der Einfachheit halber alle geraden Zahlen rot. Auf einem echten Kessel sind 1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34 und 36 rot. An den Chancen ändert das nichts: Es bleiben 18 rote, 18 schwarze und eine grüne Zahl. Die Reihenfolge auf dem Rad bleibt hier trotzdem einfach 0 bis 36.

    -     if realityNumber % 2 == 0:
    -         if realityNumber == 0:
    -             realityColor = 3  # 3 == green
    -         else:
    -             realityColor = 1  # 1 == red
    -     else:
    -         realityColor = 2  # 2 == black
    +     red = {1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36}
    +     if realityNumber == 0:
    +         realityColor = 3  # 3 == green
    +     elif realityNumber in red:
    +         realityColor = 1  # 1 == red
    +     else:
    +         realityColor = 2  # 2 == black
    -     return COLORS[1] if number % 2 == 0 else COLORS[2]
    +     red = {1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36}
    +     return COLORS[1] if number in red else COLORS[2]

Vom Buch in den Browser

Im Buch sind es zwei Programme: Roulette.py zum Selbstspielen und AutomatedRoulette.py, in dem der Computer die Verdopplungsstrategie spielt. Hier laufen beide nacheinander in einer Datei. Die Spiellogik ist übernommen, neu sind der Roulettetisch im Bild und das Budget-Diagramm.

Eingaben mit await ask() statt raw_input(). Ein Browser kann ein Programm nicht einfach anhalten, bis jemand etwas eintippt – sonst würde die ganze Seite einfrieren. ask() aus c4f wartet deshalb mit await: Python pausiert, der Browser bleibt bedienbar, und sobald du Enter drückst, geht es weiter. In modernen Browsern funktioniert auf dieser Website sogar das eingebaute input(): Python läuft in einem eigenen Hintergrund-Thread, der auf die Eingabe warten darf, ohne die Seite zu blockieren. Das setzt aber einen besonderen Sicherheitsmodus des Browsers voraus (»cross-origin isolation«). ask() funktioniert dagegen überall, deshalb nutzen es die Beispiele. Weil readInput jetzt wartet, sind auch askForBet und das Hauptprogramm async-Funktionen.

Im Buch Hier
print "Choose a number: ", + raw_input() await ask("Choose a number: ")
except Exception, arg: except Exception as arg:
print als Anweisung print() als Funktion
zwei Funktionen calculateBudget in zwei Dateien calculateBudget und calculateColorBudget in einer Datei
Ergebnis nur als Text zusätzlich Roulettetisch und Budget-Diagramm

Ein Fehler weniger. Das Original fragt Red(1) or Black(0):, Schwarz hat im Programm aber die Nummer 2. Wer der Frage folgte und 0 tippte, setzte auf eine Farbe, die es nicht gibt, und verlor jede Farbwette. Die Frage lautet jetzt Red(1) or Black(2):.

Zwei Programme, ein Name. Beide Buchprogramme haben eine Funktion calculateBudget, die automatische Fassung ohne die Wette auf eine Zahl. In einer gemeinsamen Datei würde die zweite die erste überschreiben, deshalb heißt sie hier calculateColorBudget.

Kleine Ergänzungen für das Diagramm. Die automatische Schleife merkt sich jedes Budget in der Liste history, und alle zehn Spiele wird das Diagramm neu gezeichnet. Am Ende steht zusätzlich der höchste Einsatz der Nacht in der Konsole. »Noch eine Nacht« startet die Simulation mit neuen Zufallszahlen.

Original aus dem Buch ansehen Roulette.py · Python 2
'''
Created on 24.01.2010

@author: sourcer
'''

import random

def readInput():
    guess = raw_input()
    number = -1
    if guess != '':
        try:
            number = int(guess)
        except Exception, arg:
            print "no valid number", arg

    return number

def askForBet(number):
    bet = 0
    if number != -1:
        print "Your bet:",
        bet = readInput() 
    
    return bet

def checkReality():
    realityNumber = random.randint(0, 36)
    if realityNumber % 2 == 0:
        if realityNumber == 0:
            realityColor = 3 # 3 == green
        else:
            realityColor = 1 # 1 == red
    else:
        realityColor = 2 # 2 == black

    return realityNumber, realityColor

def calculateBudget(budget, number, numberBet, color, colorBet, realityNumber, realityColor):
    if number != -1:
        budget -= numberBet
        if number == realityNumber:
            budget += numberBet*36 # 35 times plus bet which was taken
            print budget, "number"

    if color != -1:
        budget -= colorBet
        if color == realityColor:
            budget += colorBet*2
            
    return budget

def showReality(realityNumber, realityColor, budget):
    colorDef = {2: "black", 1: "Red", 3: "Green"}
    print
    print "number:\t", realityNumber
    print "color:\t", colorDef.get(realityColor)
    print "budget:\t", budget

print "Welcome to Las Vegas!"
budget = 20

while True:
    print
    print "Choose a number: ",
    number      = readInput()
    numberBet   = askForBet(number) 
             
    print "Red(1) or Black(0):",
    color       = readInput()
    colorBet    = askForBet(color)
    
    if number == -1 and color == -1:
        break
        
    realityNumber, realityColor = checkReality()
    budget = calculateBudget(budget, number, numberBet, color, colorBet, realityNumber, realityColor)
    showReality(realityNumber, realityColor, budget)
    
    if budget <= 0:
        break

print
print "Congratulations your budget is:", budget, "Dollar"
print "Ciao!"
Original aus dem Buch ansehen AutomatedRoulette.py · Python 2
'''
Created on 24.01.2010

@author: sourcer
'''

import random

def checkReality():
    realityNumber = random.randint(0, 36)
    if realityNumber % 2 == 0:
        if realityNumber == 0:
            realityColor = 3 # 3 == green
        else:
            realityColor = 1 # 1 == red
    else:
        realityColor = 2 # 2 == black

    return realityNumber, realityColor

def calculateBudget(budget, color, colorBet, realityNumber, realityColor):
    if color != -1:
        budget -= colorBet
        if color == realityColor:
            budget += colorBet*2
            
    return budget

print "Welcome to Las Vegas!"
budget = 2000

lastColor       = 0
howManyTimes    = 0
lossCounter     = 0
numberOfGamesToPlay = 1000
while numberOfGamesToPlay > 0:
    numberOfGamesToPlay -= 1
    
    if howManyTimes >= 3 and lastColor != 3:
        if lastColor == 1:
            color = 2
        else:
            color = 1
        
        colorBet = 5*(2**lossCounter)
    else:
        color    = 0
        colorBet = 0
    
    realityNumber, realityColor = checkReality()
    budget = calculateBudget(budget, color, colorBet, realityNumber, realityColor)
    
    if realityColor != color and colorBet != 0:
        lossCounter += 1
    else:
        lossCounter = 0
    
    if lastColor == realityColor:
        howManyTimes += 1
    else:
        howManyTimes = 0
    
    lastColor = realityColor
    
    if budget <= 0:
        break

print
print "Congratulations your budget is:", budget, "Dollar"
print "Ciao!"