Seite 1 von 1
Wahrscheinlichkeitsberechnung - unbrauchbares Ergebnis
Verfasst: Sonntag 28. Februar 2010, 15:01
von Jatch
Hallo,
ich beschäftige mich seit ein paar Tagen mit Python.
Um mir meine Mathehausaufgaben zu erleichtern, wollte ich ein kleines Programm schreiben, mit dem man Wahrscheinlichkeiten ausrechnen kann.
n (Azahl der Versuche), k (Anzahl der "Treffer" und p (Wahrscheinlichkeit für einen Treffer) soll der Benutzer eingeben können. Das klappt auch soweit. Leider bekomme ich als Ergebnis immer so etwas raus:
8.3399404891e-05
Ich hätte aber ganz gerne das Ergebnis als normale Dezimalzahl.
Hier mal der Code:
Code: Alles auswählen
#!/usr/bin/python3
n_input = input("n: ")
k_input = input("k: ")
p_input = input("p: ")
n = int(n_input)
k = int(k_input)
p = float(p_input)
def fakultaet(wert):
z = 1
for i in range(1,wert+1):
z = z * i
return z
fak_n = fakultaet(n) # Fakultät von n
fak_k = fakultaet(k) # Fakultät von k
fak_nk = fakultaet(n-k) # Fakultät von (n-k)
wkt = ((fak_n) / (fak_nk * fak_k)) * ((p**(n-k)) * ((1-p)**n))
print(wkt)
Wäre schön, wenn mir jemand helfen könnte.
P.S. Sonstige Verbesserungsvorschläge zum Code nehme ich gerne entgegen

Verfasst: Sonntag 28. Februar 2010, 15:07
von EyDu
Schau mal in der Dokumentation nach "String Formatting". Du suchst wahrscheinlich so etwas wie "%.5f".
Sebastian
Verfasst: Sonntag 28. Februar 2010, 16:05
von Jatch
Hi Sebastian,
danke für deine Antwort. In der Dokumentation habe ich
http://www.python.org/doc/2.1.3/lib/typ ... rings.html
gefunden. Leider weiß ich nicht, wie ich das anwenden muss.
So habe ich das mal versucht, klappt aber nicht (syntax error).
Vielleicht kannst du mir auf die Sprünge helfen?
Grüße, Marvin.
Verfasst: Sonntag 28. Februar 2010, 16:19
von DasIch
Funktioniert doch.
Code: Alles auswählen
>>> print "%(foo).5f" % {"foo": 1.555555555555555}
1.55556
Verfasst: Sonntag 28. Februar 2010, 16:52
von derdon
Fakultät musst du nicht noch einmal selber implementieren. Gibt es schon in der stdlib und ist schneller:
Code: Alles auswählen
>>> import timeit
>>> timeit.timeit('[fakultaet(i) for i in xrange(10)]', setup='''def fakultaet(wert):
... z = 1
... for i in range(1,wert+1):
... z = z * i
... return z''')
67.78303599357605
>>> timeit.timeit('[math.factorial(i) for i in xrange(10)]', setup='import math')
18.972343921661377
>>> import sys
>>> sys.version_info
(2, 6, 1, 'final', 0)
Verfasst: Sonntag 28. Februar 2010, 17:02
von Jatch
Ja, dein Code funktioniert, meiner nicht.
Ich vermute mal, das du mit
der Variable "foo" den Wert 1.5555.. zuweist?
Das brauche ich bei mir eigentlich nicht, da bei mir der Variable "wkt" schon ein Wert zugewiesen wurde:
Code: Alles auswählen
wkt = ((fak_n) / (fak_nk * fak_k)) * ((p**(n-k)) * ((1-p)**n))
Deswegen habe ich nur das genommen:
und das verursacht bei mir einen Fehler
@ derdon:
Vielen Dank für den Hinweis, werde ich gleich mal testen.
Verfasst: Sonntag 28. Februar 2010, 17:08
von Käptn Haddock
So wie das geht, mußt du ein Dictionary mit dem key 'wkt' und dem berechneten Wert übergeben, also etwa so:
Gruß Uwe
Verfasst: Sonntag 28. Februar 2010, 17:09
von derdon
aber nur etwa

Verfasst: Sonntag 28. Februar 2010, 17:13
von Käptn Haddock
derdon hat geschrieben:aber nur etwa

Das war jetzt auch frei Schnauze mit der Kuchengabel in der einen und der Kaffeetasse in der anderen Hand

Immerhin sollten die wesentlichen Stichworte enthalten sein, die korrekte Implementierung überlasse ich dem geneigten Leser. Wie an der Uni
Cu Uwe
Verfasst: Sonntag 28. Februar 2010, 17:46
von numerix
derdon hat geschrieben:Fakultät musst du nicht noch einmal selber implementieren. Gibt es schon in der stdlib und ist schneller:
Unter dem Aspekt der Geschwindigkeit würde man es so, wie vom OP gezeigt, überhaupt nicht machen (bezogen auf das eigentliche Ziel, nicht auf Fakultätsberechnung). Man nehme nur mal n=10^9 und k = 2 ...

Verfasst: Sonntag 28. Februar 2010, 18:55
von anogayales
Stichwort:
Stirling Formel für große n
Verfasst: Sonntag 28. Februar 2010, 18:59
von numerix
anogayales hat geschrieben:Stichwort:
Stirling Formel für große n
Der von mir beschriebene Fall lässt sich ohne große Mühe exakt ohne Näherungsformel in nullkommanix berechnen!
Verfasst: Sonntag 28. Februar 2010, 20:19
von hendrikS
numerix hat geschrieben:Der von mir beschriebene Fall lässt sich ohne große Mühe exakt ohne Näherungsformel in nullkommanix berechnen!
Genau, dazu muss man sich nur mal die Fakultäten aufschreiben. Und stellt dann plötzlich fest, daß man jede Menge kürzen kann.