Aufgabe 2.7: C-Programme z1 und z2
Aus LNTwww
Version vom 29. Dezember 2021, 15:49 Uhr von Guenter (Diskussion | Beiträge)
Die beiden hier angegebenen C-Programme eignen sich zur Erzeugung diskreter Zufallsgrößen:
- Die Funktion z1 erzeugt eine M–stufige Zufallsgröße mit dem Wertevorrat {0,1, ... , M−1}. Die dazugehörigen Wahrscheinlichkeiten werden im Array p_array mit der Eigenschaft „Float” übergeben. Die Funktion random() liefert gleichverteilte Float–Zufallsgrößen zwischen 0 und 1.
- Eine zweite Funktion z2 (Quelltext siehe unten) liefert eine spezielle Wahrscheinlichkeitsverteilung, die durch die beiden Parameter I und p festgelegt ist. Dieses geschieht unter Verwendung der Funktion z1.
Hinweise:
- Die Aufgabe gehört zum Kapitel Erzeugung von diskreten Zufallsgrößen.
- Insbesondere wird auf die Seite Erzeugung mehrstufiger Zufallsgrößen Bezug genommen.
Fragebogen
Musterlösung
(1) Nach dem ersten Schleifendurchlauf (m=0) ist die Variable summe = 0.2, beim nächsten (m=1) gilt summe = 0.2 + 0.3 = 0.5.
- In beiden Fällen ist somit die Variable summe kleiner als x=0.75.
- Erst bei m=2 ist die Rücksprungbedingung erfüllt: 0.9>x. Somit ist z1=2_.
(2) Richtig sind die Lösungsvorschläge 2 und 3:
- Würde man auf die Hilfsvariable x verzichten und in Zeile 8 dafür summe > random() schreiben, so würde bei jedem Schleifendurchgang ein neuer Zufallswert erzeugt und z1 hätte dann nicht die gewünschten Eigenschaften.
- z1 arbeitet gemäß dem Schaubild auf der Seite „Erzeugung mehrstufiger Zufallsgrößen“ im Theorieteil. Dort findet man eine deutlich schnellere Implementierung für den Fall gleicher Wahrscheinlichkeiten (1/M).
- Im ersten Durchlauf (m=0) ist in diesem Fall die Rücksprungbedingung aufgrund der Kleiner/Gleich–Abfrage nicht erfüllt; der Ausgabewert ist tatsächlich z1=1.
(3) Richtig sind die Lösungsvorschläge 1, 3 und 4:
- Es ergibt sich eine binomialverteilte Zufallsgröße, und zwar mit dem Wertevorrat {0,1,2,3,4}.
- Für die Berechnung der Wahrscheinlichkeit Pr(z2=0)=(1−p)I benötigt man hier die mathematische Bibliothek.
- Das Potenzieren könnte aber auch durch I–fache Multiplikation realisiert werden.
(4) Aufgrund der Zeile 6 beinhaltet das Feldelement p_array[0] vor der Programmschleife (i=0) den Wert (1−p)I.
- Im ersten Schleifendurchlauf (i=1) wird folgender Wert eingetragen:
- p_array[1]=p⋅I1−p⋅p_array[0]=I⋅p⋅(1−p)I−1=Pr(z2=1).
- Im zweiten Schleifendurchlauf (i=2) wird die Wahrscheinlichkeit für das Ergebnis „z2=2” berechnet:
- p_array[2]=p⋅(I−1)2⋅(1−p)⋅p_array[1]=(I2)⋅p2⋅(1−p)2=Pr(z2=2).
- Für I=4 und p=0.25 erhält man folgenden Zahlenwert ⇒ „4 über 2” =6:
- p_array[2]=Pr(z2=2)=6⋅116⋅916=0.211_.