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

From LNTwww
Revision as of 14:11, 6 March 2017 by Guenter (talk | contribs)

C-Programme zur Erzeugung diskreter Zufallsgrößen

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:


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