Aufgabe 2.7: C-Programme z1 und z2
Aus LNTwww
Version vom 5. März 2017, 16:24 Uhr von Guenter (Diskussion | Beiträge)
- Die beiden hier angegebenen C-Programme eignen sich zur Erzeugung diskreter Zufallsgrößen.
- „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.
Hinweis: Die Aufgabe nimmt Bezug auf die Seite Generierung mehrstufiger Zufallsgrößen im Kapitel 2.5 des vorliegenden Buches.
Fragebogen
Musterlösung
- 1. Nach dem ersten Schleifendurchlauf (m = 0) hat summe den Wert 0.2, beim nächsten (m = 1) gilt summe = 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. Würde man auf die Hilfsvariable x verzichten und in Zeile 8 „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 die Rücksprungbedingung aufgrund der Kleiner/Gleich-Abfrage nicht erfüllt; der Ausgabewert ist tatsächlich z1 = 1.
- Richtig sind somit die Vorschläge 2 und 3.
- 3. Es ergibt sich eine binomialverteilte Zufallsgröße, und zwar mit 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. Richtig sind somit die Lösungsvorschläge 1, 3 und 4.
- 4. Aufgrund der Zeile 6 beinhaltet das Feldelement p_array[0] vor der Programmschleife den Wert (1 – p)I. Im zweiten Schleifendurchlauf (i = 1) wird folgender Wert eingetragen:
- $${\rm p\_array[1]}=\frac{ p\cdot I}{ 1-\it p}\cdot{\rm p\_array[0]}= \it I\cdot p\cdot(\rm 1-\it p)^{\it I-\rm 1}=\rm Pr(\it z \rm2= \rm 1) .$$
- Im zweiten Schleifendurchlauf (i = 2) wird die Wahrscheinlichkeit für „2” berechnet:
- $${\rm p\_array[2]}=\frac{\it p\cdot (I-\rm 1)}{\rm 2\cdot (\rm 1-\it p)}\cdot{\rm p\_array[1]}= \left({\it I \atop {\rm 2}}\right)\cdot \it p^{\rm 2}\cdot(\rm 1-\it p)^{\rm 2}=\rm Pr(\it z \rm2= \rm 2) .$$
- Für I = 4 und p = 1/4 erhält man folgenden Zahlenwert („4 über 2” ergibt 6):
- $${\rm p\_array[2]}=\rm Pr(\it z \rm 2=2)=\rm 6\cdot\frac{1}{16}\cdot\frac{9}{16} \hspace{0.15cm}\underline{=0.211}.$$