Wahrscheinlichkeitsberechnung - unbrauchbares Ergebnis

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Jatch
User
Beiträge: 8
Registriert: Freitag 2. Oktober 2009, 16:19
Kontaktdaten:

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
Zuletzt geändert von Jatch am Sonntag 28. Februar 2010, 16:44, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Schau mal in der Dokumentation nach "String Formatting". Du suchst wahrscheinlich so etwas wie "%.5f".

Sebastian
Das Leben ist wie ein Tennisball.
Jatch
User
Beiträge: 8
Registriert: Freitag 2. Oktober 2009, 16:19
Kontaktdaten:

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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Funktioniert doch.

Code: Alles auswählen

>>> print "%(foo).5f" % {"foo": 1.555555555555555}
1.55556
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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)
Jatch
User
Beiträge: 8
Registriert: Freitag 2. Oktober 2009, 16:19
Kontaktdaten:

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.
Benutzeravatar
Käptn Haddock
User
Beiträge: 169
Registriert: Freitag 24. März 2006, 14:27

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
---------------------------------
have a lot of fun!
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

aber nur etwa :wink:
Benutzeravatar
Käptn Haddock
User
Beiträge: 169
Registriert: Freitag 24. März 2006, 14:27

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
---------------------------------
have a lot of fun!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Stichwort:
Stirling Formel für große n
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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!
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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