Hinweis: Diese Webseite dient als Archiv und wird nicht mehr aktualisiert. Aktuelle Artikel gibt es unter http://bwir.de

Probleme der Stochastik mit der Programmiersprache Python lösen

Wahrscheinlichkeiten lassen sich durch mathematische Theorie ermitteln. Oder durch's Ausprobieren...

Von: Pascal Ströing

 

Dieser Artikel befindet sich im Archiv und wird nicht mehr aktualisiert. Informationen können ggf. veraltet, unvollständig oder fehlerhaft sein.

Für den, der nicht genau weiß, worum es hier geht: Wikipedia über Stochastik

Problemstellungen, die durch Stochastik gelöst werden, tauchen oft auf; Finanzoptimierungen oder der Erfolg bei Glückspielen sind beispielsweise Aufgaben, bei dessen Bewältigung man sich intensiv diesem Teilgebiet der Mathematik bedient.

Manchmal ist es für talentierte Theoretiker einfach, zu einer Lösung zu kommen, aber in manchen Fällen ist man sich nicht ganz sicher, ob die erdachte Theorie wirklich stimmig ist. In vielen Fällen kommt noch dazu, dass man eine zuverlässige Lösung benötigt oder man sogar unter Zeitdruck steht, da die Lösung bei einer praktischen Umsetzung von irgend etwas benötigt wird.
Abhilfe schafft da die eher unmathematische Lösung: das Ausprobieren. Wenn nun gefragt ist, mit welcher Wahrscheinlichkeit eine geworfene Münze auf der Kopf-Seite landet, kann man das schlicht ausprobieren. Je öfter man das ausprobiert, desto zuverlässiger ist das Ergebnis (hier müsste es bei 50% liegen).

Heutige Computer sind bekanntlich rasend schnell in der Berechnung von allem Möglichem. Sie können außerdem Zufallszahlen generieren, die zwar nicht tatsächlich zufällig sind, aber durch verschiedenste Einflüsse so gut wie echte Zufallszahlen sind. Das bietet die Möglichkeit, kleine Programme zu schreiben, mit denen man das Experiment (hier das Werfen der Münze) vom Computer simulieren lässt. Der entscheidene Vorteil ist, dass man den Computer das Experiment problemlos mehrere Millionen mal durchführen lassen kann und das Ergebnis in Prozent ausgedrückt bis auf spätere Nachkommastellen zuverlässig ist.

Ich bediene mich hier der Programmiersprache Python, da diese leicht verständlich und auf meinem System äußerst leistungsfähig ist. Das behandelte Problem ist etwas komplizierter als der Wurf einer Münze:
Wie groß ist die Wahrscheinlichkeit, dass von 4 Personen mindestens 2 von ihnen im gleichen Monat Geburtstag haben?
Das Programm sieht wie folgt aus:

 # Programm zur empirischen Ermittlung von Haeufigkeiten bei einer bestimmten Fragestellung
# Sprache: Python (getestet auf Version 2.4.1 (nur Standartmodule werden verwendet))
 
 
import math, time, random, array, operator
 
 
# Editierbare Variablen
 
n	= int(math.pow(10,7))                           # n ist die Anzahl der *Durchfuehrungen* des Eperiments (hier: 10^7)
 
#-------------------------------------------------------
 
 
start	= float(time.time())                            # Zur Berechnung der Dauer der Programmdurchfuehrung
 
 
pers    = int( 4)                                       # Anzahl der Personen
monate	= int(12)                                       # Anzahl der Monate
 
 
# Die Funktion, die das Zufallsexperiment simuliert
 
def ZE():						
 
	harray	= array.array('b')                      # Ein Hilfsarray fuer die Funktion
	global pos
	pos	= bool(0)                               # Eine Variable, mit der geprueft wird, ob das Ereignis eintritt
 
	for i in range(pers):                           # Eine Schleife, die allen Personen einen Geburtsmonat zuteilt
		zufall	= random.randint(1,monate)      # Eine pseudozufaellig generierte Zahl zwischen einschl. 1 und 12
		harray.insert(i,zufall)
		if (i==1):                              # Abfragen zum Eintreten des Ereignisses A
			if (zufall==harray[0]):	
				pos = bool(1)
		if (i==2):
			if (zufall==harray[0] or zufall==harray[1]):
				pos = bool(1)
		if (i==3):
			if (zufall==harray[0] or zufall==harray[1] or zufall==harray[2]):
				pos = bool(1)
 
#-------------------------------------------------------
 
 
pos_ges	= int(0)                                         # Eine Variable mit der gezaehlt wird, wie oft das Ereignis eintritt
 
 
for l in range(n):
	ZE()
	if pos:
		pos_ges	= pos_ges+1
 
 
P_von_A	= float(operator.truediv(pos_ges,n))             # Die Wahrscheinlichkeit
 
 
# Optische Praeparation von P(A)
 
if (P_von_A<1):
	P_von_A_str	= int(P_von_A*n)
	P_von_A_str	= str(P_von_A_str)
	P_von_A_str	= "0,"+P_von_A_str
else:
	P_von_A_str	= str(P_von_A)
 
#-------------------------------------------------------
 
ende	= float(time.time())                            # Zur Berechnung der Dauer der Programmdurchfuehrung
dauer	= float(ende-start)                             # Berechnung der Dauer der Programmdurchfuehrung
 
# Ausgabeteil
 
print "\nDas Ereignis A trat bei "+str(n)+" Durchfuehrungen "+str(pos_ges)+" mal ein."
print "Es ergibt sich die Wahrscheinlichkeit P(A)="+str(pos_ges)+"/"+str(n)+"="+P_von_A_str+"."
print "\n(Die Berechnung dieser Ergebnisse dauerte "+str(dauer)+" Sekunden.)"
 

Dunkelrot eingefärbt sind die erklärenden Kommentare, die der Computer nicht beachtet. Wer Programmiersprachen kennt, der weiß, dass die Variablen bei manchen Sprachen Typen benötigen. Das sind hier z.B. "int" (Integer: Ganzzahl) oder "str" (String: Zeichenkette). Letztlich verständlich ist dieses Projekt wahrscheinlich nur, wenn man mit den Grundlagen des Programmierens vertraut ist, da ich hier nicht noch Schleifenstrukturen und if-Abfragen erläutern möchte. Aber eines sollte noch für die gesagt werden, die speziell mit der Sprache Python nicht vertraut sind: Python arbeitet bei der Zusammenfassung von mehreren Befehlen nur mit dem Einrücken; begin, end oder Klammern verwendet man dafür bei Python nicht.

Jetzt noch die Ergebnisse, zu dem das Programm kam als Konsolenausgabe:

 Das Ereignis A trat bei 10000000 Durchfuehrungen 4271622 mal ein.

Es ergibt sich die Wahrscheinlichkeit P(A)=4271622/10000000=0,4271622.

(Die Berechnung dieser Ergebnisse dauerte 489.580043077 Sekunden.)

Kommentar verfassen

Name:
E-Mail:
Optional - wird vor Spam geschützt
Kommentar:
HTML-Code ist nicht möglich
Tipp: Abonnieren Sie diese Kommentare als RSS-Feed, um über neue Einträge auf dem Laufenden zu sein.