Python :: Aufgabe #110
5 Lösungen

Gute Wette oder schlechte Wette?
Anfänger - Python
von hollst
- 23.06.2016 um 19:12 Uhr
Ich finde, eine interessante Aufgabenstellung sollte immer mit einer kleinen Geschichte verbunden sein. Ansonsten wird die Aufgabenstellung in der Allgemeinheit mit "rein theoretische" oder "für das Leben uninteressant" abgestempelt. Nun gut, die Mathematik fragt nicht danach, ob irgendeine Aufgabenstellung für das Leben "interessant" ist, für sie sollte eine Aufgabenstellung "an sich" interessant sein, unabhängig vom paktischen Wert. Aber lassen wir das Philosphieren beiseite und kommen zu der Geschichte:
Du hast einen spielsüchtigen Mitbürger getroffen, nennen wir ihn den Banker. Nach einiger Zeit schlägt dir der Banker ein einfaches Würfelspiel vor: du gewinnst, wenn eine gerade Zahl fällt, er, wenn eine ungerade Zahl gefallen ist. Du bist nicht spielsüchtig und erwiders, dass du an einem solchen Spiel, bei dem die Chancen 50 zu 50 stehen, kein Interesse hast. Gewinnen tut nur der, der mehr Glück hat und auf so etwas vertraust du nicht.
Der Banker bleibt hartnäckig. Er schlägt dir vor, dass du nicht nur gewinnst beim Fallen einer geraden Zahl, sondern zusätzlich, wenn die Eins fällt. Hiermit bist du einverstanden, denn deine Chancen sind mit etwa 67 zu 33 wesentlich besser. Doch der Banker sagt: "Halt! Mir ist natürlich klar, dass Du in diesem Fall die bessere Position hast. Als Ausgleich bekommst du im Falle eines Gewinnes aber auch nur 4/6 der Tischgeldes ausgezahlt, der Rest geht an mich zurück." Deine Antwort: "Na, dann sind wir ja wieder wie zu Beginn, ich habe kein Interesse."
Der Banker bleibt am Ball: "Okay, im Falle eines Gewinnes bekommst du nicht nur 66,666... % sondern sogar 70 % des Tischgeldes. Den kleinen Nachteil werde ich mit meinem glücklicheren Händchen schon wieder ausgleichen." Gut, das ist dir plausibel und das Spile geht los.
Jetzt zur Aufgabenstellung: Ist es in der Tat wahr, dass du mit den 70 % (leicht) im Vorteil gegenüber dem Banker bist? Zur Beantwortung der Frage gibt es im Prinzip zwei Wege, den experimentellen und den theoretischen. Wir wollen den experimentellen Weg wählen (Simulation). Sowohl du als auch der Banker haben in jeder Runde ein Grundgeld von 100 €. Der Einsatz bei jeder Würfelung sein 1 € und eine Runde geht über 100 Würfe (somit brauchst du im dümmsten Fall, falls du wirklich jeden der 100 Würfe einer Runde verlieren solltest, trotzdem keine Bankrotterklärung abgeben). Die Frage lautet: Wie oft hast du im Mittel am Ende einer 100-Würfe-Runde mehr als deine 100-€-Startgeldmenge auf deiner Seite?
PS: Falls dir dein Simulationsergebnis irgendwie komisch vorkommt, versuche doch durch Überlegung (theoretischer Weg) herauszubekommen, ob deine Simulation nicht doch richtig sein könnte.
Du hast einen spielsüchtigen Mitbürger getroffen, nennen wir ihn den Banker. Nach einiger Zeit schlägt dir der Banker ein einfaches Würfelspiel vor: du gewinnst, wenn eine gerade Zahl fällt, er, wenn eine ungerade Zahl gefallen ist. Du bist nicht spielsüchtig und erwiders, dass du an einem solchen Spiel, bei dem die Chancen 50 zu 50 stehen, kein Interesse hast. Gewinnen tut nur der, der mehr Glück hat und auf so etwas vertraust du nicht.
Der Banker bleibt hartnäckig. Er schlägt dir vor, dass du nicht nur gewinnst beim Fallen einer geraden Zahl, sondern zusätzlich, wenn die Eins fällt. Hiermit bist du einverstanden, denn deine Chancen sind mit etwa 67 zu 33 wesentlich besser. Doch der Banker sagt: "Halt! Mir ist natürlich klar, dass Du in diesem Fall die bessere Position hast. Als Ausgleich bekommst du im Falle eines Gewinnes aber auch nur 4/6 der Tischgeldes ausgezahlt, der Rest geht an mich zurück." Deine Antwort: "Na, dann sind wir ja wieder wie zu Beginn, ich habe kein Interesse."
Der Banker bleibt am Ball: "Okay, im Falle eines Gewinnes bekommst du nicht nur 66,666... % sondern sogar 70 % des Tischgeldes. Den kleinen Nachteil werde ich mit meinem glücklicheren Händchen schon wieder ausgleichen." Gut, das ist dir plausibel und das Spile geht los.
Jetzt zur Aufgabenstellung: Ist es in der Tat wahr, dass du mit den 70 % (leicht) im Vorteil gegenüber dem Banker bist? Zur Beantwortung der Frage gibt es im Prinzip zwei Wege, den experimentellen und den theoretischen. Wir wollen den experimentellen Weg wählen (Simulation). Sowohl du als auch der Banker haben in jeder Runde ein Grundgeld von 100 €. Der Einsatz bei jeder Würfelung sein 1 € und eine Runde geht über 100 Würfe (somit brauchst du im dümmsten Fall, falls du wirklich jeden der 100 Würfe einer Runde verlieren solltest, trotzdem keine Bankrotterklärung abgeben). Die Frage lautet: Wie oft hast du im Mittel am Ende einer 100-Würfe-Runde mehr als deine 100-€-Startgeldmenge auf deiner Seite?
PS: Falls dir dein Simulationsergebnis irgendwie komisch vorkommt, versuche doch durch Überlegung (theoretischer Weg) herauszubekommen, ob deine Simulation nicht doch richtig sein könnte.
Lösungen:

#!/usr/bin/python3 # -*- encoding: utf-8 -*- # #>>>autor: Sebastian Müller #>>>licence: GPL #>>>contact: mypythonmueller@gmail.com # #Programm nach folgender Aufgabenstellung: #Ich finde, eine interessante Aufgabenstellung sollte immer mit einer kleinen #Geschichte verbunden sein. Ansonsten wird die Aufgabenstellung in der #Allgemeinheit mit "rein theoretische" oder "für das Leben uninteressant" #abgestempelt. Nun gut, die Mathematik fragt nicht danach, ob irgendeine #Aufgabenstellung für das Leben "interessant" ist, für sie sollte eine #Aufgabenstellung "an sich" interessant sein, unabhängig vom paktischen Wert. #Aber lassen wir das Philosphieren beiseite und kommen zu der Geschichte: #Du hast einen spielsüchtigen Mitbürger getroffen, nennen wir ihn den Banker. #Nach einiger Zeit schlägt dir der Banker ein einfaches Würfelspiel vor: du #gewinnst, wenn eine gerade Zahl fällt, er, wenn eine ungerade Zahl gefallen #ist. Du bist nicht spielsüchtig und erwiders, dass du an einem solchen Spiel, #bei dem die Chancen 50 zu 50 stehen, kein Interesse hast. Gewinnen tut nur der, #der mehr Glück hat und auf so etwas vertraust du nicht. #Der Banker bleibt hartnäckig. Er schlägt dir vor, dass du nicht nur gewinnst #beim Fallen einer geraden Zahl, sondern zusätzlich, wenn die Eins fällt. #Hiermit bist du einverstanden, denn deine Chancen sind mit etwa 67 zu 33 #wesentlich besser. Doch der Banker sagt: "Halt! Mir ist natürlich klar, dass #Du in diesem Fall die bessere Position hast. Als Ausgleich bekommst du im Falle #eines Gewinnes aber auch nur 4/6 der Tischgeldes ausgezahlt, der Rest geht an #mich zurück." Deine Antwort: "Na, dann sind wir ja wieder wie zu Beginn, ich #habe kein Interesse." #Der Banker bleibt am Ball: "Okay, im Falle eines Gewinnes bekommst du nicht #nur 66,666... % sondern sogar 70 % des Tischgeldes. Den kleinen Nachteil #werde ich mit meinem glücklicheren Händchen schon wieder ausgleichen." Gut, das #ist dir plausibel und das Spile geht los. #Jetzt zur Aufgabenstellung: Ist es in der Tat wahr, dass du mit den 70 % #(leicht) im Vorteil gegenüber dem Banker bist? Zur Beantwortung der #Frage gibt es im Prinzip zwei Wege, den experimentellen und den theoretischen. #Wir wollen den experimentellen Weg wählen (Simulation). Sowohl du als auch der #Banker haben in jeder Runde ein Grundgeld von 100 €. Der Einsatz bei jeder #Würfelung sein 1 € und eine Runde geht über 100 Würfe (somit brauchst du im #dümmsten Fall, falls du wirklich jeden der 100 Würfe einer Runde verlieren #solltest, trotzdem keine Bankrotterklärung abgeben). Die Frage lautet: Wie #oft hast du im Mittel am Ende einer 100-Würfe-Runde mehr als deine 100-€- #Startgeldmenge auf deiner Seite? #PS: Falls dir dein Simulationsergebnis irgendwie komisch vorkommt, versuche #doch durch Überlegung (theoretischer Weg) herauszubekommen, ob deine #Simulation nicht doch richtig sein könnte. #!!!!! Die Frage lautet: Wie #!!!!! oft hast du im Mittel am Ende einer 100-Würfe-Runde mehr als deine 100-€- #!!!!! Startgeldmenge auf deiner Seite? print("""Simulationsprogramm für Gewinnausschüttung, bei einer Gewinnaufteilung von: 2:4 mit 100% Gewinn ("Banker") gegen 4:2 bei 70% Gewinn ("Ich"). Simuliert werden Durchgänge á 100 Würfe mit einem Einsatz von 1Euro, also einer Gewinnmarge von 2Euro bzw. 1,40Euro zu 0,70Euro.""") runden = 0 while not runden: try: print("Bitte die gewünschte Anzahl an simulierten Runden eingeben,") runden = int(input("mindestens 20 maximal 9.999.999 (Das sollte als" "Simulation genügen ;) >>> ")) if runden < 20: raise RuntimeError("Zahl leider zu klein.") elif runden > 9999999: RuntimeError("Zahl leider zu groß") except ValueError: print("Eingabe war leider keine ganze Zahl.") except RuntimeError as e: print(e) runden = 0 gesammt = 0 print() print() for ganzerunden in range(1, runden + 1): banker = 100 ich = 100 frunden = len(str(runden)) import random random.seed() for i in range(100): wuerfel = random.randint(1, 6) gewinn = (1, 2, 4, 6) if wuerfel in gewinn: banker -= 0.4 ich += 0.4 else: banker += 1 ich -= 1 gesammt = gesammt + ich - 100 if len(str(runden)) == 2: vorlauf = ("{0:12} {1:2}. {2:15}".format("Ergebnis der", ganzerunden, "Runde:")) print("{0:36} {1:<8} {2:8.2f}€".format(vorlauf, "Banker:", banker)) print("{0:36} {1:<8} {2:8.2f}€".format("", "Ich:", ich)) print("{0:36} {1:<8} {2:8.2f}€".format("Kontostand insgesammt:", "Ich:", gesammt)) print("{0:.>55}".format("")) elif len(str(runden)) == 3: vorlauf = ("{0:12} {1:3}. {2:15}".format("Ergebnis der", ganzerunden, "Runde:")) print("{0:37} {1:<8} {2:9.2f}€".format(vorlauf, "Banker:", banker)) print("{0:37} {1:<8} {2:9.2f}€".format("", "Ich:", ich)) print("{0:37} {1:<8} {2:9.2f}€".format("Kontostand insgesammt:", "Ich:", gesammt)) print("{0:.>57}".format("")) elif len(str(runden)) == 4: vorlauf = ("{0:12} {1:4}. {2:15}".format("Ergebnis der", ganzerunden, "Runde:")) print("{0:38} {1:<8} {2:10.2f}€".format(vorlauf, "Banker:", banker)) print("{0:38} {1:<8} {2:10.2f}€".format("", "Ich:", ich)) print("{0:38} {1:<8} {2:10.2f}€".format("Kontostand insgesammt:", "Ich:", gesammt)) print("{0:.>59}".format("")) elif len(str(runden)) == 5: vorlauf = ("{0:12} {1:5}. {2:15}".format("Ergebnis der", ganzerunden, "Runde:")) print("{0:39} {1:<8} {2:11.2f}€".format(vorlauf, "Banker:", banker)) print("{0:39} {1:<8} {2:11.2f}€".format("", "Ich:", ich)) print("{0:39} {1:<8} {2:11.2f}€".format("Kontostand insgesammt:", "Ich:", gesammt)) print("{0:.>61}".format("")) elif len(str(runden)) == 6: vorlauf = ("{0:12} {1:6}. {2:15}".format("Ergebnis der", ganzerunden, "Runde:")) print("{0:40} {1:<8} {2:12.2f}€".format(vorlauf, "Banker:", banker)) print("{0:40} {1:<8} {2:12.2f}€".format("", "Ich:", ich)) print("{0:40} {1:<8} {2:12.2f}€".format("Kontostand insgesammt:", "Ich:", gesammt)) print("{0:.>63}".format("")) else: vorlauf = ("{0:12} {1:7}. {2:15}".format("Ergebnis der", ganzerunden, "Runde:")) print("{0:41} {1:<8} {2:13.2f}€".format(vorlauf, "Banker:", banker)) print("{0:41} {1:<8} {2:13.2f}€".format("", "Ich:", ich)) print("{0:41} {1:<8} {2:13.2f}€".format("Kontostand insgesammt:", "Ich:", gesammt)) print("{0:.>65}".format(""))
Das Programmieren war nicht so das Problem aber hatte Schwierigkeiten den mathematischen Teil der Aufgabe zu verstehen. Hoffe auf Feedback, sollte meine Lösung falsch sein.
Python-Code
Beispielausgabe:
Es werden 10 Runden á 100 Würfe gespielt:
1. Runde Endergebnis:
Banker: 114.6 € - Mitspieler: 85.4 €
2. Runde Endergebnis:
Banker: 116.0 € - Mitspieler: 84.0 €
3. Runde Endergebnis:
Banker: 106.2 € - Mitspieler: 93.8 €
4. Runde Endergebnis:
Banker: 104.8 € - Mitspieler: 95.2 €
5. Runde Endergebnis:
Banker: 109.0 € - Mitspieler: 91.0 €
6. Runde Endergebnis:
Banker: 100.6 € - Mitspieler: 99.4 €
7. Runde Endergebnis:
Banker: 106.2 € - Mitspieler: 93.8 €
8. Runde Endergebnis:
Banker: 106.2 € - Mitspieler: 93.8 €
9. Runde Endergebnis:
Banker: 106.2 € - Mitspieler: 93.8 €
10. Runde Endergebnis:
Banker: 104.8 € - Mitspieler: 95.2 €
Nach diesen 10 Runden liegt der Mitspieler im Schnitt bei nur 92.54 €.

# -*- coding: utf-8 -*- from random import randint runden = 1 ergebnis = 0 print "Es werden 10 Runden á 100 Würfe gespielt:\n" # 10 Runden while runden < 11: mitspieler = float(100) banker = float(100) wuerfe = 100 # 100 Durchgänge while wuerfe > 0: banker = banker - 1 mitspieler = mitspieler - 1 # Zufallszahl ziehen wurf = randint(1, 6) # Gewinnerverteilung if wurf % 2 == 0 or wurf == 1: mitspieler = mitspieler + 1.4 banker = banker + 0.6 else: banker = banker + 2 wuerfe = wuerfe - 1 # Ausgabe je Runde print str(runden) + ". Runde Endergebnis:" print "Banker:", banker, "€\tMitspieler:", mitspieler,"€\n" # Ergebnis des Mitspielers pro Runde ergebnis = ergebnis + mitspieler # Nächste Runde runden = runden + 1 # Analyse print "\nNach diesen 10 Runden liegt der Mitspieler im Schnitt bei nur", \ ergebnis / 10, "€."
Beispielausgabe:
Es werden 10 Runden á 100 Würfe gespielt:
1. Runde Endergebnis:
Banker: 114.6 € - Mitspieler: 85.4 €
2. Runde Endergebnis:
Banker: 116.0 € - Mitspieler: 84.0 €
3. Runde Endergebnis:
Banker: 106.2 € - Mitspieler: 93.8 €
4. Runde Endergebnis:
Banker: 104.8 € - Mitspieler: 95.2 €
5. Runde Endergebnis:
Banker: 109.0 € - Mitspieler: 91.0 €
6. Runde Endergebnis:
Banker: 100.6 € - Mitspieler: 99.4 €
7. Runde Endergebnis:
Banker: 106.2 € - Mitspieler: 93.8 €
8. Runde Endergebnis:
Banker: 106.2 € - Mitspieler: 93.8 €
9. Runde Endergebnis:
Banker: 106.2 € - Mitspieler: 93.8 €
10. Runde Endergebnis:
Banker: 104.8 € - Mitspieler: 95.2 €
Nach diesen 10 Runden liegt der Mitspieler im Schnitt bei nur 92.54 €.

import random durchgaenge = 15 gesamt = 0 for j in range(1, durchgaenge + 1): gewinn_runden = 0 verlust_runden = 0 wuerfe = 100 for i in range(1, wuerfe + 1): ergebnis = random.randint(1,6) if ergebnis == 3 or ergebnis == 5: verlust_runden += 1 else: gewinn_runden += 1 geld = gewinn_runden * 0.7 * 2 print('\nGewinnrunden:',gewinn_runden,'\nDas Geld nach den',wuerfe,'Wuerfen betraegt',round(geld,2),'Euro') gesamt += geld gesamt = gesamt / durchgaenge print('\nNach',durchgaenge,'Durchgaenge betraegt das durchschnittliche Endgeld:',round(gesamt,2))

from random import * # Würfelwurf def wurf(): return randint(1,6) # Wettbedingungen def wette(wurf): if wurf % 2 == 0 or wurf == 1: # ist die Augenzahl gerade oder == 1 dann gewinne ich return True else: # sonst gewinnt der Banker return False # 100-Würfe-Runde def runde(): ich = 100 # Startkapital banker = 100 for i in range(100): ich = ich - 1 # Einsätze banker = banker - 1 pot = 2 # Pot pro Runde if wette(wurf()) == True: # wenn ich gewinne bekomme ich 70% vom Pot, der Banker bekommt 30 % vom Pot ich = ich + pot*0.7 banker = banker + pot*0.3 else: # wenn der Banker gewinnt bekommt er 100% vom Pot banker = banker + pot return ich # Funktion gibt meinen Kontostand nach 100 Würfen zurück # Simulation über n 100-Würfe-Runden def sim(n): wincounter = 0 for i in range(n): if runde() > 100: # wenn der Kontostand nach einer 100-Würfe-Runde höher als 100 ist, zählt die Runde als gewonnen wincounter = wincounter + 1 return wincounter # Funktion gibt Anzahl der gewonnenen Runden zurück # Ermittlung des arithmetischen Mittels der Runden mit absolutem Gewinn bei m Simulationen über n 100-Würfe-Runden def armittel(m, n): summe = 0 for i in range(m): summe = summe + sim(n) print ("Bei", m, "Simulationen über je", n, "Runden mit je 100 Würfen hatte ich im Mittel bei", summe/m, "der", n, "Runden mehr Geld als zu Beginn des Spiels")

#Zocken from random import choice print("Gute oder schlechte Wette") def Wette(): ich,banker=100,100 L=[1,2,3,4,5,6] G=[1,2,4,6] for i in range(100): ich,banker=ich-1,banker-1 x=choice(L) if x in G: ich=ich+0.7*2 banker=banker+0.3*2 else: banker=banker+2 return (ich,banker) runden=int(input("Bitte die Anzahl der Runden eingeben:")) ich=0 banker=0 for i in range(runden): (x,y)=Wette() print(x,y) ich,banker=ich+x,banker+y print("Ich habe nach den Spielen wahrscheinlich: ",ich/runden," und der Banker: ",banker/runden)