241
Zurück zum random walk
Muster 12: Bedingte Schleife (while-Schleife)
Zweck:
Solange eine Bedingung erfüllt ist, eine Folge von Anweisungen
wiederholt ausführen.
Im Programmentwurf:
Initialisiere Schleifenvariablen,
die in bedingung vorkommen
Solange bedingung erfüllt ist wiederhole:
Anweisung 1
Anweisung 2
...
Im Programmcode:
Initialisierung der Schleifenvariablen
while bedingung:
Anweisung1
Anweisung2
...
Zurück zum random walk
Wir wollen jetzt herausfinden, wie viele Schritte die Turtle auf ihrem Zu-
fallsweg im Durchschnitt ausführen muss, bis sie eine bestimmte Entfer-
nung vom Ausgangspunkt erreicht hat. Probleme dieser Art sind von be-
deutenden Forschern untersucht worden. Begonnen hat es um 1828, als
der Biologe Robert Brown unter dem Mikroskop die später nach ihm be-
nannte Bewegung kleiner Pflanzenpollen in einem Wassertropfen unter-
suchte. Genaueres zur Brown’schen Bewegung findest du zum Beispiel hier:
http://schulen.eduhi.at/riedgym/Physik/10/waerme/temperatur/brownsche_
bewegung.htm
1905 hat Albert Einstein in seinem
annus mirabilis
– seinem »Wunderjahr«
– klären können, wie es zu dieser Bewegung kommt.
So betrachtet sieht die ganze Sache schon etwas ernsthafter aus als nur
eine »torkelnde Turtle«.
>
Starte IPI-T
URTLE
G
RAFIK
und lade
randomwalk_arbeit.py
in ein
Editor-Fenster.
bedingung
muss auswertbar sein!
Schleifenkop
f
Schleifenkörper
... muss Schleifenvariable verändern!
242
Der Zufall und bedingte Schleifen
Kapitel
9
Wir werden jetzt eine Funktion
randomwalk()
hinzufügen, die so wie
zufallsweg()
arbeitet, nur mit dem Unterschied, dass die Anzahl der
Schritte nicht angegeben wird, sondern der Zufallsweg abgebrochen wird,
wenn eine bestimmte Entfernung vom Ausgangspunkt überschritten wird.
Das läuft im Wesentlichen darauf hinaus, die
for
-Schleife durch eine
while
-Schleife zu ersetzen.
Allerdings müssen wir noch klären, wie wir die Entfernung der Turtle zum
Startpunkt feststellen können. Dabei helfen uns zwei Funktionen aus dem
turtle
-Modul: die Funktion
position()
, die uns die aktuelle Position
der Turtle zurückgibt, und die Funktion
distance()
, die die Entfernung
der Turtle zu einem gegebenen Punkt zurückgibt.
>
Mach mit!
>>> from turtle import *
>>> position()
(0.00,0.00)
>>> start = position()
>>> start
(0.00,0.00)
>>> distance(start)
0.0
>>> forward(100)
>>> distance(start)
100.0
>>> rt(90); fd(100)
>>> distance(start)
141.4213562373095
>>> rt(90); fd(100)
>>> position()
(100.00,0.00)
>>> distance(start)
100.00000000000001
>>> distance(50,50)
70.710678118654769
distance()
misst Entfernungen.
243
Zurück zum random walk
Damit können wir leicht eine erste Fassung von
randomwalk()
erstellen:
def randomwalk(entfernung, schrittlaenge, maxwinkel=180):
pu(); home(); pd()
startwinkel = random.randint(0,359)
right(startwinkel)
start = position()
while distance(start) < entfernung:
zufallsschritt(schrittlaenge, maxwinkel)
>
Füge den Code von
randomwalk()
in dein Programm ein und entfer-
ne den von
zufallsweg()
.
>
Ersetze im Hauptprogramm den Aufruf von
zufallsweg()
durch den
folgenden Aufruf von
randomwalk()
, bei dem als maximaler Winkel
der Standardwert 180 verwendet wird.
randomwalk(150, 15)
Damit hast du den ersten Teil unseres Problems schon gelöst.
>
Speichere eine Kopie dieses Programms als
randomwalk03.py
ab.
Die Turtle stoppt ihre Irr-
fahrt in einer vorgegebenen
Entfernung vom
Startpunkt.
244
Der Zufall und bedingte Schleifen
Kapitel
9
Kaum lernst du etwas Neues, hast du es auch schon mit einer Ausnahme zu
tun: Ist dir aufgefallen dass in der
while
-Schleife dieses Programms keine
Schleifenvariable geändert wird. Es geht eben
doch
auch anders: hier än-
dert sich der
Zustand
der Grafik, in diesem Fall die Lage der Turtle. Und
diese wird in der Bedingung für den nächsten Schleifendurchgang mittels
der Funktion
distance()
abgefragt.
Wenn du den Ablauf diese Programms verfolgst, wirst du sehen, dass die
Irrfahrten der Turtle sehr unterschiedliche Länge haben können. Und den
durchschnittlichen Wert dieser Längen wollen wir auch noch feststellen.
Ermitteln wir zunächst die Weglängen für die einzelnen Irrfahrten:
start = position()
schritte = 0
while distance(start) < entfernung:
zufallsschritt(schrittlaenge, maxwinkel)
schritte = schritte + 1
print("Anzahl der Schritte:", schritte)
>
Führe diese Änderungen in
randomwalk_arbeit.py
ein und führe
das Programm aus. Du erhältst eine Ausgabe wie diese:
Anzahl der Schritte: 38
Anzahl der Schritte: 89
Anzahl der Schritte: 63
Anzahl der Schritte: 164
Anzahl der Schritte: 78
Anzahl der Schritte: 153
Aber jeder Programmlauf liefert ein anderes Bild und andere Zahlen. Um
den Durchschnittswert der erforderlichen Schritte zu erhalten, müssen wir
alle diese Schritte zusammenzählen und dann durch die Anzahl der Irrfahr-
ten dividieren. Ein ähnliches Problem hatten wir schon: die Punkte bei
miniquiz.py
. Wir lösen es hier ähnlich:
>
Führe eine globale Variable
schrittsumme
ein. Sie muss in den
Funktionen
randomwalk()
und
randomwalk_test()
als
global
deklariert werden.
>
Initialisiere in
randomwalk_test()
die Variable
schrittsumme
(vor
der
for
-Schleife) mit
0
.
>
Füge am Ende von
randomwalk()
eine Anweisung ein, die
schrittsumme
jeweils um
schritte
erhöht.

Get Python für Kids now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.