Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

FBMath

von RedakteurnemoredSeite 5 von 5

Kombinatorik und Wahrscheinlichkeitsrechnung

Binomialkoeffizienten

Wie groß ist die Wahrscheinlichkeit, im Lotto "sechs Richtige" zu haben?
Die Lösung dieser Aufgabe läuft über die Laplace-Wahrscheinlichkeit, für die man zunächst die Anzahl aller Ziehungsmöglichkeiten benötigt. Da aus 49 Kugeln 6 ohne Zurücklegen gezogen werden, wobei die Reihenfolge keine Rolle spielt, ergeben sich

49! / ( 6! * (49 - 6)! ) Möglichkeiten

was dem Binomialkoeffizenten "6 aus 49" entspricht.

Fakultätsberechnungen auf BefehlsreferenzeintragUINTEGER-Basis werden bereits bei 13! = 6227020800 das Handtuch werfen. FBMath enthält zur Fakultätsberechnung die Funktion Fact(n), die mit BefehlsreferenzeintragDOUBLE-Werten rechnet. Damit können Fakultäten bis n=170 berechnet werden (allerdings natürlich nur in der Genauigkeit von DOUBLE).
Direkt mit den Fakultäten gerechnet, können so die Anzahl der Möglichkeiten bestimmt werden:

anzahl = Fact(49) / Fact(6) / Fact(49-6)

Auch wenn das hier ermittelte Ergebnis korrekt ist, sollte dennoch lieber eine andere Möglichkeit verwendet werden: Mit Binomial(n,k) wird der benötigte Binomialkoeffizient mit geringerem Aufwand berechnet.

anzahl = Binomial(49, 6)

Ein Vorteil dieser Methode ist, dass sich wesentlich höhere Binomialkoeffizienten berechnen lassen, als dies mit der Fakultät möglich wäre.

#include once "math.bi"
dim as integer n = 400, k = 3
dim as double nFact, kFact, nkFact, ergebnis
print "Berechne den Binomialkoeffizienten '" & k & " aus " & n & "'"
print

print "Berechnung mit Binomial(" & n & ", " & k & ")"
ergebnis = Binomial(n, k)
if MathErr then
  print "Es ist ein Fehler aufgetreten!"
else
  print "Ergebnis: " & ergebnis
end if
print

print "Berechnung mit Fact(" & n & ") / Fact(" & k & ") / Fact(" & n-k & ")"
nFact = Fact(n)
if MathErr then print "Bei der Berechnung von n! ist ein Fehler aufgetreten!" : end
kFact = Fact(k)
if MathErr then print "Bei der Berechnung von k! ist ein Fehler aufgetreten!" : end
nkFact = Fact(n-k)
if MathErr then print "Bei der Berechnung von (n-k)! ist ein Fehler aufgetreten!" : end
print "Ergebnis: " & nFact / kFact / nkFact

Während "3 aus 400" mit ein wenig Geschick selbst mit einem einfachen Taschenrechner schnell bestimmt werden kann, liegt die Berechnung von 400! bereits weit jenseits der berechenbaren Grenze.


Binomialverteilung

Die Binomialverteilung wird benötigt, wenn eine Reihe von gleichartigen, unabhängigen Zufallsexperimenten durchgeführt wird, bei denen es nur zwei mögliche Ergebnisse gibt (z. B. 'Erfolg' und 'Misserfolg'). Ein klassisches Beispiel ist das n-malige Werfen eines Würfels und das Zählen der dabei gefallenen Einser.

PBinom(n, p, k) berechnet die Wahrscheinlichkeit, dass bei einem n-fachen Ausführen eines Zufallsexperiment genau k-mal das Ergebnis 'Erfolg' erzielt wird, wobei ein 'Erfolg' die Wahrscheinlichkeit p besitzt.

Beispiel: Ein (Laplace-)Würfel wird 90 mal geworfen. Wie groß ist die Wahrscheinlichkeit, dass genau 15 mal eine Eins geworfen wird?

Wahrscheinlichkeit = PBinom(90, 1/6, 15)

Das folgende Beispiel stellt die Binomialverteilung für diese Parameter grafisch dar.

#include once "math.bi"
dim as integer n = 90                         ' Anzahl der Würfe
dim as double p = 1 / 6                       ' Erfolgswahrscheinlichkeit
dim as integer fensterB = 602, fensterH = 400 ' Fenstermaße
screenres fensterB, fensterH

' errechnete Maße:
' Breite für den Balken
dim as integer balkenB = fensterB \ (n+1)
' Streckungsfaktor: der größte Wert ergibt sich bei k = n*p
dim as integer streck = int(0.9*fensterH / PBinom(n, p, int(n*p)))

dim as double w

for k as integer = 0 to n
  ' berechne die Wahrscheinlichkeit dafür, dass genau k Einser fallen
  w = PBinom(n, p, k)

  'grafische Darstellung
  line (k*balkenB, fensterH-1)-step(balkenB-1, - w*streck),, b
next

sleep

FBinom(n, p, k) berechnet die Wahrscheinlichkeit für 'höchstens k Treffer'. Die Wahrscheinlichkeit, bei 90 Würfen mit einem (Laplace-)Würfel bis zu 15 mal die Eins zu werfen, beträgt

Wahrscheinlichkeit = FBinom(90, 1/6, 15)

Um die Wahrscheinlichkeit für 'mindestens k Treffer' zu bestimmen, muss der Weg über das Gegenereignis gegangen werden:

P("mindestens k Treffer") = 1 - P("höchstens k-1 Treffer")

Also beträgt die Wahrscheinlichkeit dafür, mindestens 15 mal die Eins zu werfen

Wahrscheinlichkeit =  1 - FBinom(90, 1/6, 14)

(Das Tutorial wird noch erweitert.)

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 06.11.2010 von Redakteurnemored angelegt.
  • Die aktuellste Version wurde am 12.11.2010 von Redakteurnemored gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen