Lazarus/Spielen mit dem Zufall: Unterschied zwischen den Versionen

Aus ZUM-Unterrichten
main>Peterdauscher
(Die Seite wurde neu angelegt: „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>) …“)
 
main>Peterdauscher
Keine Bearbeitungszusammenfassung
Zeile 5: Zeile 5:




{{kasten_blau|<source  line start=30 highlight="9" lang="pascal">
procedure TForm1.Button1Click(Sender: TObject);
var i  : integer;
    zufallszahl : integer;


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 gezogen werden. Dem kann man 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.
begin
Clear(Memo1);
for i:=1 to 5
do begin
  zufallszahl:=random(100);
  WriteLnTo(Memo1,zufallszahl);
  end;
end;   
</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.
 
{{kasten_blau|<source  line start=30 highlight="7" lang="pascal">
procedure TForm1.Button1Click(Sender: TObject);
var i  : integer;
    zufallszahl : integer;
 
begin
Clear(Memo1);
randomize;
for i:=1 to 5
do begin
  zufallszahl:=random(100);
  WriteLnTo(Memo1,zufallszahl);
  end;
end;       
</source>}}
 
'''Anmerkung:''' Es schadet nichts, zu wissen, was dieses <tt>randomize</tt> eigentlich tut. Eigentlich kann ein klassischer Computer keine wirklich zufälligen Zahlen erzeugen sondern nur [https://de.wikipedia.org/wiki/Pseudozufall 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 <tt>randomize</tt> immer die gleiche ist, ist auch die daraus berechnete Folge von Pseudozufallszahlen immer die gleiche. <tt>randomize</tt> ermittelt jetzt bei jedem Programmlauf eine andere Anfangszahl. Dafür benutzt der Befehl die Zeit der Computeruhr. 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.

Version vom 17. Januar 2013, 19:04 Uhr

Bisher haben wir Zahlenwerte immer entweder fest im Programm vorgegeben (etwa a:=42), vom Benutzer während der Eingabe erfragt (etwa mit ReadFrom(...)) 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 Zufallszahl zwischen 0 und bereich-1.


Vorlage:Kasten blau

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 randomize; ausführen lässt. Der sorgt dafür, dass die Zufallszahlen tatsächlich bei jedem Programmlauf andere sind.

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 ist bei jedem Programmstart eine andere und sie hängt -- irgendwie dann doch zufällig -- davon ab, wann genau der Benutzer das Programm startet.