Die grafische Darstellung von Verteilungsfunktionen ist sehr hilfreich, wenn man diese Funktionen verstehen und anwenden will.
Worum es geht:
Die Binomialverteilung beschreibt den wahrscheinlichen Ausgang einer Folge von Versuchen, bei denen der elementare Einzelversuch nur zwei mögliche Ergebnisse hat (Beispiel Münzwurf). Wenn das erwünschte Ergebnis die Wahrscheinlichkeit p besitzt und n die Zahl der Versuche ist, gibt die Verteilungsfunktion an, mit welcher Wahrscheinlichkeit sich x Erfolge einstellen.
Für die normierte Wahrscheinlichkeit gilt die Dichtefunktion, auch Wahrscheinlichkeitsverteilung genannt), f(x) (unten schwarz dargestellt):
Die zwei Parameter p (Wahrscheinlichkeit) und n (Fallzahl) sollen natürlich wählbar sein. Das machen wir später. Zunächst kommt der Programmkern.
| Sub Binom(p As Single, n As Integer) Dim X As Single, fx As Single, FFx As Single, anz As String 'Diagramm vorbereiten Picture1.Cls Picture1.Scale (0, 1)-(n + 1, -0.05) Picture1.DrawWidth = 1 For X = 0 To 5 Picture1.Line (0, X / 5)-(n + 1, X / 5) Next Picture1.CurrentY = 0 For X = 1 To n Picture1.CurrentX = X - 0.01 * n Picture1.Print X; Next 'Ausdruck vorbereiten anz = "Binomische Verteilung" & vbCrLf anz = anz & "Treffer Wahrsch. TrefferVT" & vbCrLf 'Rechnen und Darstellen FFx = 0 For X = 0 To n fx = a_ü_b(n, X) * p ^ X * (1 - p) ^ (n - X) FFx = FFx + fx Picture1.Line (X, FFx)-(X + 0.3, 0), QBColor(14), BF Picture1.Line (X, fx)-(X + 0.3, 0), QBColor(0), BF anz = anz & X & vbTab & Format(fx, "00.00%") & vbTab & Format(FFx, "Standard") & vbCrLf Next End SubText1.Text = anz Function a_ü_b(ByVal a As Integer, ByVal b As Integer) As Single Dim i As integer, erg As Single If b = 0 Then erg = 1 Else erg = a / b If b > 1 Then Do a = a - 1 b = b - 1 erg = erg * a / b Loop Until b = 1 End If End If End Functiona_ü_b = erg |
Wie sieht das Ganze aus? Gucken wir mal, zuerst das Diagramm; hier mit den Werten p = 0,25, n=20

Dann die zugehörige Werteausgabe, die man braucht, wenn mit den Werten der Verteilungsfunktion gerechnet werden soll:

Schließlich, damit es ein Programm wird, fehlt noch die mögliche Variation der beiden Parameter. Bequem ist es mit ScrollBars zu realisieren. So könnte es aussehen.

Hier wurde ein Steuerelementefeld genutzt, denn dies führt zu übersichtlicherem Programmcode und ermöglicht die unkomplizierte Erweiterung. Das Schreiben des Codes ist einfach, weil die Steuerelemente innerhalb dieser Auswertungsroutine alle gleich, nämlich HScroll1(Index) heißen.
Ihre jeweilige Bedeutung erkennt man am Caption, an der erfolgenden Zuweisung oder, wer's mag, an zusätzlichen Kommentaren.
| Private Sub HScroll1_Change(Index As Integer) If Not init Then Select Case Index Case 0 p = HScroll1(Index).Value / 100 Label2(Index).Caption = p Case 1 n = HScroll1(Index).Value Label2(Index).Caption = n End Select Binom p, n End If End Sub |
Zwei Besonderheiten sind noch zu nennen.
1. Der Aufruf endet immer mit einem Aufruf der Rechen- und Malroutine Binom(). Damit ist sichergestellt, daß das gezeigte Bild der Verteilung unter allen Umständen "richtig ist", also zu den gewählten Parametern gehört. Ein zusätzlicher "Rechne"-Button erübrigt sich.
2. Eine " If Not init Then"-Sperre soll sicherstellen, daß die Scroller nicht während der Startphase, in der sie voreingestellt werden, tätig werden. Das führt zwar nicht unbedingt ins Verderben, zu undefinierten Startwerten aber allemal. Die Boolsche Variable " init" wird von der Form-Load-Prozedur gesteuert.
Wo ist die?
Sie wurde noch nicht gezeigt. Soll aber gleich folgen.
Es fehlen die globalen Deklarationen, alle Steuerelementeeigenschaften, die nicht im Eigenschaftenfenster gesetzt wurden. (Hinweis: Solche Eigenschaften, die man später, etwa bei einer Programmüberarbeitung evtl. ändern möchte, besser in Form_Load per Zuweisung festsetzen, weil man dann später sieht, was man getan hat.)
| Alle Reste! Option Explicit Dim p As Single, n As Integer, init As Boolean Private Sub Form_Load() init = True End Subp = 0.4 HScroll1(0).Min = 1 HScroll1(0).Max = 100 HScroll1(0).Value = p * 100 Label2(0) = p n = 10 HScroll1(1).Min = 1 HScroll1(1).Max = 100 HScroll1(1).Value = n Label2(1) = n init = False Private Sub Form_Activate() Binom p, n End Sub |
Nachbemerkungen
1. Zu den "Resten": Wieso ein Form_Activate?
Das Programmfenster soll sich mit einem gültigen Diagramm öffnen. Man kann das erstmalige Rechnen/Malen aber nicht in Form_Load aufrufen, denn das Diagramm-Fenster erschiene dann leer. Malereien werden erst in der auf Form_Load folgenden Prozedur Form_Activate ausgeführt.
2. Wer jetzt eine andere Wahrscheinlichkeitsverteilung malen muß, vielleicht eine "hypergeometrische" (auch diskret, aber drei Parameter!), der muß wohl oder übel einen weiteren Scroller einbauen, genau eine Zeile des Programms - welche wohl? - und evtl. die Benennung der Prozedur " Binom" verändern.