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

Aufgabe 2.7: C-Programme z1 und z2

Aus LNTwww
Version vom 29. Dezember 2021, 15:49 Uhr von Guenter (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
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 folgenden 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 schnellere Programmrealisierungen als  z1.
Der Rückgabewert  random() = 0.2  führt zum Ergebnis  z1=1.

3

Welche der folgenden 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?

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  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)=(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 „z2=2” berechnet:
p_array[2]=p(I1)2(1p)p_array[1]=(I2)p2(1p)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)=6116916=0.211_.