Lazarus/Spielen mit dem Zufall: Unterschied zwischen den Versionen

Aus ZUM-Unterrichten
main>Peterdauscher
Keine Bearbeitungszusammenfassung
main>Peterdauscher
Keine Bearbeitungszusammenfassung
Zeile 2: Zeile 2:


Bisher haben wir Zahlenwerte immer entweder fest im Programm vorgegeben (etwa a:=42),
Bisher haben wir Zahlenwerte immer entweder fest im Programm vorgegeben (etwa a:=42),
vom Benutzer während der Eingabe erfragt (etwa mit <tt>ReadFrom(...)</tt>) oder aber irgendwie aus bereits bekannten Werten ausgerechnet (z.B. <tt>a:=sqrt(c)</tt>). Für viele Anwendungen – vor allem für die, die ein bisschen Spaß machen – wäre es jedoch nett, zufällige Zahlen zu haben. Das gilt z.B. für Glücksspiele genauso wie für Geschicklichkeitsspiele.
vom Benutzer während der Eingabe erfragt (etwa mit <tt>a:=StrToInt(...)</tt>) oder aber irgendwie aus bereits bekannten Werten ausgerechnet (z.B. <tt>a:=sqrt(c)</tt>). Für viele Anwendungen – vor allem für die, die ein bisschen Spaß machen – wäre es jedoch nett, zufällige Zahlen zu haben. Das gilt z.B. für Glücksspiele genauso wie für Geschicklichkeitsspiele.


Für solche Fragen ist der Befehl <tt>random</tt> nützlich. Ohne Klammer hinter dem Befehl (also etwa <tt>x:=random;</tt>) “würfelt” der Befehl eine (reelle) Zufallszahl im Bereich zwischen 0 und 1. Damit ist es mit ein bisschen Mathematik nicht schwierig, auch natürliche Zufallszahlen in beliebigen Zahlenbereichen zu basteln. Allerdings nimmt Lazarus einem einen Teil dieser Arbeit ab, wenn man eine Zahl in Klammern hinter den Befehl schreibt (also etwa <tt>k:=random(bereich);</tt>). Der Computer würfelt dann eine Zufallszahl zwischen 0 und <tt>bereich-1</tt>.
Für solche Fragen ist der Befehl <tt>random</tt> nützlich. Ohne Klammer hinter dem Befehl (also etwa <tt>x:=random;</tt>) “würfelt” der Befehl eine (reelle) Zufallszahl im Bereich zwischen 0 und 1. Damit ist es mit ein bisschen Mathematik nicht schwierig, auch natürliche Zufallszahlen in beliebigen Zahlenbereichen zu basteln. Allerdings nimmt Lazarus einem einen Teil dieser Arbeit ab, wenn man eine Zahl in Klammern hinter den Befehl schreibt (also etwa <tt>k:=random(bereich);</tt>). Der Computer würfelt dann eine ganzzahlige Zufallszahl zwischen 0 und <tt>bereich-1</tt>.




{{kasten_blau|<source  line start=30 highlight="6" lang="pascal">
{{kasten_blau|<source  line start=30 highlight="3" lang="pascal">
procedure TForm1.Button1Click(Sender: TObject);
procedure TForm1.Button1Click(Sender: TObject);
begin
begin
Memo1.Lines.Clear;
  z:=random(100);
for i:=1 to 5
  Edit1.Text:=IntToStr(z);
do begin
end;    
  zufallszahl:=random(100);
  Memo1.Lines.Add(IntToStr(zufallszahl));
  end;
end;  
</source>}}
</source>}}


Startet man ein Programm, das auf Knopfdruck eine Zufallszahl ziehen soll mehrfach, so ist allerdings zunächst die Enttäuschung groß. Denn es ist immer die gleiche Zahl bzw. die gleichen Zahlen, die beim ersten Knopfdruck nach dem Programmstart gezogen werden. So großartig zufällig ist das nun wirklich nicht. Dem kann man jedoch abhelfen, wenn man gleich nach dem Programmstart den Befehl <tt>randomize;</tt> ausführen lässt. Der sorgt dafür, dass die Zufallszahlen tatsächlich bei jedem Programmlauf andere sind.
Tatsächlich: Auf den ersten Blick kommt bei jedem Knopfdruck eine vollkommen zufällige Zahl heraus. Doch der Schein trügt: Wenn man sich die ersten 3 Zahlen nach dem ersten Knopfdruck notiert, dann das Programm neu startet und das Vorgehen noch ein paar mal wiederholt, wird man feststellen: Die Zahlenfolge ist nach dem Programm-Neustart immer die gleiche.


{{kasten_blau|<source  line start=30 highlight="4" lang="pascal">
So großartig zufällig ist das nun wirklich nicht. Dem kann man jedoch abhelfen, wenn man gleich nach dem Programmstart den Befehl <tt>randomize;</tt> ausführen lässt. Der sorgt dafür, dass die Zufallszahlen tatsächlich bei jedem Programmlauf andere sind. Zusätzlich zum Click-Ereignis des Buttons bauen wir jetzt einfach noch ein Programmstück, was beim Erzeugen des Fensters ausgeführt wird.
procedure TForm1.Button1Click(Sender: TObject);
 
{{kasten_blau|<source  line start=30 highlight="3" lang="pascal">
procedure TForm1.FormCreate(Sender: TObject);
begin
begin
Memo1.Lines.Clear;
  randomize;
randomize;
end;    
for i:=1 to 5
do begin
  zufallszahl:=random(100);
  Memo1.Lines.Add(IntToStr(zufallszahl));
  end;
end;        
</source>}}
</source>}}



Version vom 18. April 2014, 13:33 Uhr


Bisher haben wir Zahlenwerte immer entweder fest im Programm vorgegeben (etwa a:=42), vom Benutzer während der Eingabe erfragt (etwa mit a:=StrToInt(...)) oder aber irgendwie aus bereits bekannten Werten ausgerechnet (z.B. a:=sqrt(c)). Für viele Anwendungen – vor allem für die, die ein bisschen Spaß machen – wäre es jedoch nett, zufällige Zahlen zu haben. Das gilt z.B. für Glücksspiele genauso wie für Geschicklichkeitsspiele.

Für solche Fragen ist der Befehl random nützlich. Ohne Klammer hinter dem Befehl (also etwa x:=random;) “würfelt” der Befehl eine (reelle) Zufallszahl im Bereich zwischen 0 und 1. Damit ist es mit ein bisschen Mathematik nicht schwierig, auch natürliche Zufallszahlen in beliebigen Zahlenbereichen zu basteln. Allerdings nimmt Lazarus einem einen Teil dieser Arbeit ab, wenn man eine Zahl in Klammern hinter den Befehl schreibt (also etwa k:=random(bereich);). Der Computer würfelt dann eine ganzzahlige Zufallszahl zwischen 0 und bereich-1.


Vorlage:Kasten blau

Tatsächlich: Auf den ersten Blick kommt bei jedem Knopfdruck eine vollkommen zufällige Zahl heraus. Doch der Schein trügt: Wenn man sich die ersten 3 Zahlen nach dem ersten Knopfdruck notiert, dann das Programm neu startet und das Vorgehen noch ein paar mal wiederholt, wird man feststellen: Die Zahlenfolge ist nach dem Programm-Neustart immer die gleiche.

So großartig zufällig ist das nun wirklich nicht. Dem kann man jedoch abhelfen, wenn man gleich nach dem Programmstart den Befehl randomize; ausführen lässt. Der sorgt dafür, dass die Zufallszahlen tatsächlich bei jedem Programmlauf andere sind. Zusätzlich zum Click-Ereignis des Buttons bauen wir jetzt einfach noch ein Programmstück, was beim Erzeugen des Fensters ausgeführt wird.

Vorlage:Kasten blau

Anmerkung: Es schadet nichts, zu wissen, was dieses randomize eigentlich tut. Eigentlich kann ein klassischer Computer keine wirklich zufälligen Zahlen erzeugen sondern nur Pseudozufallszahlen. Diese berechnet man aus einer anfänglich gegebenen Zahl durch Gleichungen, die scheinbar ungeordnete, aber eben nicht wirklich zufällige Zahlen erzeugen. Da die Anfangszahl ohne die Verwendung von randomize immer die gleiche ist, ist auch die daraus berechnete Folge von Pseudozufallszahlen immer die gleiche. randomize ermittelt jetzt bei jedem Programmlauf eine andere Anfangszahl. Dafür benutzt der Befehl die Zeit der Computeruhr, die "Systemzeit". Die ist bei jedem Programmstart eine andere und sie hängt -- irgendwie dann doch zufällig -- davon ab, wann genau der Benutzer das Programm startet.

Aufgaben

  1. Schreibe ein Lazarus-Programm zum Würfeln, bei dem nach dem Drücken eines Knopfes in einem Edit-Feld eine Zahl zwischen 1 und 6 erscheint.
  2. In manchen Würfelspielen wird mit zwei Würfeln gewürfelt. Schreibe ein Programm, das bei jedem Wurf mit zwei (gedachten) Würfeln würfelt und die Zahlen ausgibt; außerdem die Augensumme. Weiterhin soll das Programm ausgeben, wenn es bei einem Wurf ein „Pasch“ gegeben hat (Augenzahl bei beiden Würfeln gleich).
  3. Fred und George erfinden ein Würfelspiel. Jeder darf 10 mal würfeln (Zahlen zwischen 1 und 6). Es gewinnt, wessen größte Zahl am größen ist. Schreibe ein Programm, das auf Knopfdruck ein solches zehnmaliges Würfeln simuliert und die Werte in ein Memo-Feld schreibt. Außerdem soll es dann noch direkt sagen, welches die größte gewürfelte Zahl war: "Die größte Zahl war ..."
  4. Schreibe ein (sehr vereinfachtes) Roulette-Rad, das zufällig eine Zahl zwischen 0 und 36 erzeugt. Für die Zahlen zwischen 1 und 36 soll die Maschine ausgeben, ob die Zahl gerade ist (PAIR) oder ungerade (IMPAIR). Wenn sie Null ist, soll die Maschine ZERO ausgeben.
  5. Kartenlegerin Esmeralda steigt endlich auf moderne Technik um. Sie verwendet seit jeher Skat-Karten. Dort gibt es die “Farben” Kreuz, Pique, Herz und Karo. Außerdem gibt es die Zahlen bzw. Figuren 7, 8, 9, 10, Bube, Dame, König, Ass.
    Insgesamt gibt es also 4 · 8 = 32 Karten. Schreiben Sie für Esmeralda ein Programm, das eine zuf¨allige Karte erzeugt (also zum Beispiel “Pique 10”).
    Hinweis: Man kann es sehr umständlich machen und eine Zufallszahl zwischen 1 und 32 ziehen und entsprechend eine bestimmte Karte zuordnen. Es geht aber auch deutlich eleganter.
  6. Fülle die Bildoberfläche mit 5000 komplett zufällig verteilten und zufällig gefärbten Pixeln.