________________________________________________________________________________
Inhalt....: Eine Zufallsreise mit MuPAD - Grafische Interpretation von Zufall
Kategorie.: Arbeitsblatt
Mathematik: Stochastik, Statistik
MuPAD.....: 3.0.0
Datum.....: 2002-01-17
Autoren...: Julia Faflek <faflek@upb.de>
Funktionen: plot, plot::Turtle, random, mod, map
________________________________________________________________________________
Eine Zufallsreise mit MuPAD
Der hier beschriebene visuelle Test basiert auf sogenannten Turtle-Grafiken. Die Idee, die
sich dahinter verbirgt, ist folgende: Eine Schildkröte befindet sich auf dem Bildschirm und
erhält Anweisungen in welche Richtung sie sich bewegen soll. Sie kann nach oben, nach
unten, nach rechts und nach links laufen. Dabei hinterlässt sie Spuren, d.h. auf dem Bild-
schirm sind Linien zu sehen, die uns anzeigen, wohin die Schildkröte gelaufen ist.
Wir definieren zunächst eine Prozedur randomWalk, die eine gegebene
Liste von Zufallszahlen zwischen 0 und 1 als Laufvorschrift für die Schild-
kröte interpretiert und diese visualisiert:
randomWalk:= proc( ZahlenListe:DOM_LIST )
local T;
begin
T:= plot::Turtle():
T::setLineColor(RGB::Black):
for i from 1 to nops(ZahlenListe) do
Richtung:= floor(4 * ZahlenListe[i]) +1;
case (Richtung)
of 1 do /* right(0) */ T::forward(1);
break;
of 2 do T::right(PI/2): T::forward(1);
break;
of 3 do T::right(PI): T::forward(1);
break;
of 4 do T::right(3*PI/2): T::forward(1);
break;
otherwise
error("Ungültiger Wert in Zahlenliste");
end_case:
end_for:
plot(T)
end_proc:
Wir prüfen nun, ob der Zufallsgenerator random von MuPAD eine "gute",
d.h. scheinbar zufällige Verteilung der generierten Werte aufweist. Dazu
führen wir den "random walk" für zwei Zufallsfolgen durch:
Zufall:= random(1..99):
randomWalk( [ Zufall()/100 $ i=1..1000 ] ):
randomWalk( [ Zufall()/100 $ i=1..1000 ] ):


Die beiden Grafiken scheinen rein zufällig zu sein, da man keine Strukturen
oder Bewegungsmuster erkennen kann.
Zur Unterstützung dieser Annahme wollen wir einen „schlechten" linearen
Kongruenzgenerator LKG definieren:
LKG:= proc(x0, a, b, n, m)
local x, i;
begin
x:= [0 $ m];
x[1]:= x0;
for i from 2 to m do
x[i]:= a * x[i-1] + b mod n;
end_for;
return(x);
end_proc:
und diesen auf die gleiche Weise überprüfen:
Zufall:= (x0,n) -> map( LKG(x0, 2, 3, 97, n), `/`, 97):
randomWalk( Zufall(1,1000) ):
randomWalk( Zufall(4,1000) ):


Beide Grafiken sind sehr einfach "gestrickt" wobei sich jeweils sehr deutlich
ein sich wiederholendes Muster erkennen lässt. An der geringen Komplexität
des zweiten Grafen lässt sich direkt ablesen, dass der Zufallsgenerator eine
sehr kurze Periodenlänge hat. D.h. die von ihm erzeugten Zahlen wiederholen
sich schon nach wenigen Schritten. Um diese These zu untermauern, lassen
wir uns die ersten 70 Zufallszahlen anzeigen:
Z:=Zufall(4,70)
![]()
Wir lesen ab, dass das der Zufallsgenerator eine Periodenlänge von 48 hat,
denn es gilt: Z[1] = Z[49]:
bool( Z[1] = Z[49] )
![]()
________________________________________________________________________________
Übungen:
1. Schreiben Sie eigene Zufallszahlengeneratoren und untersuchen Sie diese mittels randomWalk.
2. Schreiben Sie eine Prozedur, die anhand einer Liste von Zufallszahlen versucht die Länge der
Periode des Zufallszahlengenerators zu ermittlen.
________________________________________________________________________________
Anmerkungen:
1. Weitere Anregungen finden Sie in der Buchreihe Mathematik 1 x anders. In dieser Reihe
wird eine Vielzahl unterschiedlichster mathematischer Probleme mit MuPAD gelöst. Die
Bücher können unter www.schule.mupad.de/literatur kostenfrei kopiert werden.
_______________________________________________________________________________