Exercise 2.7: C Programs "z1" and "z2"

From LNTwww
Revision as of 14:07, 2 September 2016 by Nabil (talk | contribs) (Die Seite wurde neu angelegt: „ {{quiz-Header|Buchseite=Stochastische Signaltheorie/Erzeugung von diskreten Zufallsgrößen }} right| :Die beiden hier angeg…“)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

P ID122 Sto A 2 7.png
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

1

Es gelte M = 4 und p_array = {0.2, 0.3, 0.4, 0.1}. Welches Ergebnis liefert die Funktion z1, wenn die Randomfunktion den Wert x = 0.75 zurückgibt?

$z1$ =

2

Welche der nachfolgenden Aussagen sind bezüglich z1 zutreffend?

Man könnte auf die Zuweisung x = random() in Zeile 5 verzichten und in Zeile 8 direkt mit random() vergleichen.
Sind alle übergebenen Wahrscheinlichkeiten gleich, so gäbe es schneller Programmrealisierungen als z1.
Der Rückgabewert random() = 0.2 führt zu z1 = 1.

3

Welche der nachfolgenden Aussagen sind bezüglich z2 zutreffend?

Das Programm erzeugt eine binomialverteilte Zufallsgröße.
Das Programm erzeugt eine poissonverteilte Zufallsgröße.
Mit I = 4 sind für z2 die Werte 0, 1, 2, 3 und 4 möglich.
Das Einbinden der mathematischen Bibliothek <math.h> ist erforderlich, da in z2 die Funktion pow (Potenzieren) verwendet wird.

4

Welcher Wert steht in p_array[2] beim Aufruf mit I = 4 und p = 0.25?

$I\ =\ 4,\ p\ =\ 0.25:\ \ \ \ p\_array[2]$ =


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}.$$