Loading [MathJax]/jax/output/HTML-CSS/fonts/TeX/fontdata.js

Aufgabe 2.7: C-Programme z1 und z2

Aus LNTwww
Wechseln zu:Navigation, Suche

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, ... , M1}, 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,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) 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<x=0.75. Erst bei m=2 ist die Rücksprungbedingung erfüllt: 0.9>x. Somit ist z1=2_.

(2)  Richtig sind die Vorschläge 2 und 3:

  • 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 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 Wertevorrat {0,1,2,3,4}.
  • Für die Berechnung der Wahrscheinlichkeit Pr(z2=0)=(1p)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 (1p)I. Im ersten Schleifendurchlauf (i=1) wird folgender Wert eingetragen: p_array[1]=pI1pp_array[0]=Ip(1p)I1=Pr(z2=1).

Im zweiten Schleifendurchlauf (i=2) wird die Wahrscheinlichkeit für das Ergebnis „2” berechnet: p_array[2]=p(I1)2(1p)p_array[1]=(I2)p2(1p)2=Pr(z=2).

Für I=4 und p=0.25 erhält man folgenden Zahlenwert („4 über 2” ergibt 6): p_array[2]=Pr(z2=2)=6116916=0.211_.