Aufgaben:Aufgabe 2.7: C-Programme z1 und z2: Unterschied zwischen den Versionen

Aus LNTwww
Wechseln zu:Navigation, Suche
Zeile 34: Zeile 34:
 
+ Das Programm erzeugt eine <i>binomialverteilte</i> Zufallsgr&ouml;&szlig;e.
 
+ Das Programm erzeugt eine <i>binomialverteilte</i> Zufallsgr&ouml;&szlig;e.
 
-  Das Programm erzeugt eine <i>poissonverteilte</i> Zufallsgr&ouml;&szlig;e.
 
-  Das Programm erzeugt eine <i>poissonverteilte</i> Zufallsgr&ouml;&szlig;e.
+ Mit $I = 4$ sind f&uuml;r $z2$ die Werte 0, 1, 2, 3 und 4 m&ouml;glich.
+
+ Mit $I = 4$ sind f&uuml;r $z2$ die Werte $0, 1, 2, 3, 4$ m&ouml;glich.
 
+ Das Einbinden der mathematischen Bibliothek &bdquo;'''math.h'''&rdquo; ist erforderlich, da in $z2$ die Funktion &bdquo;'''pow'''&rdquo;  (Potenzieren) verwendet wird.
 
+ Das Einbinden der mathematischen Bibliothek &bdquo;'''math.h'''&rdquo; ist erforderlich, da in $z2$ die Funktion &bdquo;'''pow'''&rdquo;  (Potenzieren) verwendet wird.
  
Zeile 40: Zeile 40:
 
{Welcher Wert steht  in $p\_array[2]$ beim Aufruf mit $I = 4$ und $p = 0.25$?
 
{Welcher Wert steht  in $p\_array[2]$ beim Aufruf mit $I = 4$ und $p = 0.25$?
 
|type="{}"}
 
|type="{}"}
$I=4,\; p = 0.25:\ \ \ \ p\_array[2] \ = $  { 0.211 3% }
+
$I=4,\; p = 0.25\hspace{-0.1cm}:\ \ \ \ p\_array[2] \ = $  { 0.211 3% }
  
  
Zeile 48: Zeile 48:
 
===Musterlösung===
 
===Musterlösung===
 
{{ML-Kopf}}
 
{{ML-Kopf}}
:<b>1.</b>&nbsp;&nbsp;Nach dem ersten Schleifendurchlauf (<i>m</i> = 0) hat <i>summe</i> den Wert 0.2, beim n&auml;chsten (<i>m</i> = 1) gilt <i>summe</i> = 0.5. In beiden F&auml;llen ist somit die Variable <i>summe</i> kleiner als <i>x</i> = 0.75. Erst bei <i>m</i> = 2 ist die R&uuml;cksprungbedingung erf&uuml;llt: 0.9 > <i>x</i>. Somit ist <u><i>z</i>1 = 2</u>.
+
'''(1)'''&nbsp; Nach dem ersten Schleifendurchlauf ($m = 0$) ist die Variable $summe = 0.2$, beim n&auml;chsten ($m = 1$) gilt $summe = 0.2 + 0.3 =0.5$. In beiden F&auml;llen ist somit die Variable $summe < x = 0.75$. Erst bei $m = 2$ ist die R&uuml;cksprungbedingung erf&uuml;llt: $0.9 > x$</i>. Somit ist $\underline{z1 = 2}$.
  
:<b>2.</b>&nbsp;&nbsp;W&uuml;rde man auf die Hilfsvariable <i>x</i> verzichten und in Zeile 8 &bdquo;summe > random()&rdquo; schreiben, so w&uuml;rde bei jedem Schleifendurchgang ein neuer Zufallswert erzeugt und <i>z</i>1 h&auml;tte dann nicht die gew&uuml;nschten Eigenschaften.
+
'''(2)'''&nbsp; Richtig sind die <u>Vorschläge 2 und 3</u>:
 +
*W&uuml;rde man auf die Hilfsvariable $x$ verzichten und in Zeile 8 &bdquo;'''summe > random()'''&rdquo; schreiben, so w&uuml;rde bei jedem Schleifendurchgang ein neuer Zufallswert erzeugt und $z1$ h&auml;tte dann nicht die gew&uuml;nschten Eigenschaften.
 +
*$z1$ arbeitet gemäß dem Schaubild auf der Seite „Erzeugung mehrstufiger Zufallsgrößen“ im Theorieteil. Dort findet man eine deutlich schnellere Implementierung f&uuml;r den Fall gleicher Wahrscheinlichkeiten ($1/M$).
 +
*Im ersten Durchlauf ($m = 0$) ist in diesem Fall die R&uuml;cksprungbedingung aufgrund der Kleiner/Gleich-Abfrage nicht erf&uuml;llt; der Ausgabewert ist tatsächlich $z1 = 1$.
  
:<i>z</i>1 arbeitet gemäß dem Schaubild auf der Seite „Erzeugung mehrstufiger Zufallsgrößen“ im Theorieteil. Dort findet man eine deutlich schnellere Implementierung f&uuml;r den Fall gleicher Wahrscheinlichkeiten (1/<i>M</i>).
 
  
: Im ersten Durchlauf (<i>m</i> = 0) ist die R&uuml;cksprungbedingung aufgrund der Kleiner/Gleich-Abfrage nicht erf&uuml;llt; der Ausgabewert ist tatsächlich <i>z</i>1 = 1.
+
'''(3)'''&nbsp; Richtig sind die <u>Lösungsvorschläge 1, 3 und 4</u>:
:Richtig sind somit die <u>Vorschläge 2 und 3</u>.
+
*Es ergibt sich eine binomialverteilte Zufallsgr&ouml;&szlig;e, und zwar mit Wertevorrat $\{0, 1, 2, 3, 4\}$.
 +
*F&uuml;r die Berechnung der Wahrscheinlichkeit ${\rm Pr}(z2 = 0) = (1 -p)^{I}$ ben&ouml;tigt man hier die mathematische Bibliothek.  
 +
*Das Potenzieren k&ouml;nnte aber auch durch $I$&ndash;fache Multiplikation realisiert werden.  
  
:<b>3.</b>&nbsp;&nbsp;Es ergibt sich eine binomialverteilte Zufallsgr&ouml;&szlig;e, und zwar mit Wertevorrat {0, 1, 2, 3, 4}. F&uuml;r die Berechnung der Wahrscheinlichkeit Pr(<i>z</i>2 = 0) = (1 &ndash; <i>p</i>)<sup><i>I</i></sup> ben&ouml;tigt man hier die mathematische Bibliothek. Das Potenzieren k&ouml;nnte aber auch durch <i>I</i>-fache Multiplikation realisiert werden. Richtig sind somit die <u>Lösungsvorschläge 1, 3 und 4</u>.
 
  
:<b>4.</b>&nbsp;&nbsp;Aufgrund der Zeile 6 beinhaltet das Feldelement <i>p_array</i>[0] vor der Programmschleife den Wert (1 &ndash; <i>p</i>)<sup><i>I</i></sup>. Im zweiten Schleifendurchlauf (<i>i</i> = 1) wird folgender Wert eingetragen:
+
'''(4)'''&nbsp; Aufgrund der Zeile 6 beinhaltet das Feldelement $p\_array</i>[0]$ vor der Programmschleife ($i = 0$) den Wert $(1 -p)^{I}$. Im ersten 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) .$$
+
$${p\_array[1]}=\frac{ p\cdot I}{ 1- p}\cdot{p\_array[0]}=   I\cdot p\cdot(1- p)^{ I- 1}={\rm Pr}(z2= 1) .$$
  
:Im zweiten Schleifendurchlauf (<i>i</i> = 2) wird die Wahrscheinlichkeit für &bdquo;2&rdquo; berechnet:
+
Im zweiten Schleifendurchlauf ($i = 2$) wird die Wahrscheinlichkeit für das Ergebnis  &bdquo;2&rdquo; 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) .$$
+
$${p\_array[2]}=\frac{p\cdot (I- 1)}{ 2\cdot ( 1- p)}\cdot{ p\_array[1]}=  \left({ I \atop { 2}}\right)\cdot p^{\rm 2}\cdot( 1- p)^{\rm 2}={\rm Pr}( z = 2) .$$
  
:Für <i>I</i> = 4 und <i>p</i> = 1/4 erhält man folgenden Zahlenwert (&bdquo;4 über 2&rdquo; ergibt 6):
+
Für $I= 4$ und $p = 0.25$ erhält man folgenden Zahlenwert (&bdquo;4 über 2&rdquo; ergibt 6):
:$${\rm p\_array[2]}=\rm Pr(\it z \rm 2=2)=\rm 6\cdot\frac{1}{16}\cdot\frac{9}{16}
+
$${p\_array[2]}={\rm Pr}( z 2=2)=6\cdot\frac{1}{16}\cdot\frac{9}{16}
 
\hspace{0.15cm}\underline{=0.211}.$$
 
\hspace{0.15cm}\underline{=0.211}.$$
 
{{ML-Fuß}}
 
{{ML-Fuß}}

Version vom 6. März 2017, 15:42 Uhr

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, 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\hspace{-0.1cm}:\ \ \ \ 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 $\underline{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 ${\rm 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.


(4)  Aufgrund der Zeile 6 beinhaltet das Feldelement $p\_array</i>[0]$ vor der Programmschleife ($i = 0$) den Wert $(1 -p)^{I}$. Im ersten Schleifendurchlauf ($i = 1$) wird folgender Wert eingetragen: $${p\_array[1]}=\frac{ p\cdot I}{ 1- p}\cdot{p\_array[0]}= I\cdot p\cdot(1- p)^{ I- 1}={\rm Pr}(z2= 1) .$$

Im zweiten Schleifendurchlauf ($i = 2$) wird die Wahrscheinlichkeit für das Ergebnis „2” berechnet: $${p\_array[2]}=\frac{p\cdot (I- 1)}{ 2\cdot ( 1- p)}\cdot{ p\_array[1]}= \left({ I \atop { 2}}\right)\cdot p^{\rm 2}\cdot( 1- p)^{\rm 2}={\rm Pr}( z = 2) .$$

Für $I= 4$ und $p = 0.25$ erhält man folgenden Zahlenwert („4 über 2” ergibt 6): $${p\_array[2]}={\rm Pr}( z 2=2)=6\cdot\frac{1}{16}\cdot\frac{9}{16} \hspace{0.15cm}\underline{=0.211}.$$