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 :D

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).

Code: Alles auswählen

print '%(wkt).5f'
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

Code: Alles auswählen

% {"foo": 1.555555555555555}
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:

Code: Alles auswählen

print '%(wkt).5f'
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:

Code: Alles auswählen

 print '%(wkt).5f % {'wkt': berechneter_wert}
Gruß Uwe

Verfasst: Sonntag 28. Februar 2010, 17:09
von derdon
aber nur etwa :wink:

Verfasst: Sonntag 28. Februar 2010, 17:13
von Käptn Haddock
derdon hat geschrieben:aber nur etwa :wink:
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 ... :D

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.