Zufallswert auf mehr als eine Möglichkeit anwenden

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Erutan
Beiträge: 2
Registriert: Di 6. Aug 2013, 21:25

Zufallswert auf mehr als eine Möglichkeit anwenden

Beitrag von Erutan »

Hallo zusammen,

ja, das Thema ist im Betreff wirklich blöd umschrieben, aber ich weiß wirklich nicht wie ich es besser umschreiben kann.
Ich habe mir gerade Lazarus installiert. In den Jahren 2005 - 2007 habe ich hin und wieder mal mit Delphi bis Version 6 gearbeitet aber die läßt sich unter meinem Windows nicht mehr zum Laufen bringen.

Ich habe folgendes Problem:

Ich möchte gerne eine sogenannte "Schmidt-Maschine" als Windws Programm nachbauen.
Die originale Schmidt-Maschine war ein, auf radiaktivem Zerfall basierdender Zufallsgenerator mit dessen Hilfe ihr Erfinder Helmut Schmidt Telekineseversuche angestellt hat.
Sie bestand aus dem eigentlich Zufallsgenerator und kreisförmig angeordneten Leuchten. Die Leuchten leuchteten links herum auf wenn der Zufallsgenerator eine 0 ausspuckte und rechts herum wenn er eine 1 ausspuckte.

Und dieses links herum, rechts herum ist auch das Problem, das ich habe.

Wenn es nur zwei Lampen gäbe, würde ich es mit einer if then else Weiche lösen.

If der Wert 0 ist then links blinken, else rechts blinken.

Beim Schmidt-Machinen-Nachbau habe ich jedoch nicht nur zwei, sondern 10 Lampen bzw. TShapes.

Die Dinger sind kreisförmig angeordnet. Es beginnt oben mit TShape1, dann geht es im Uhrzeigersinn weiter mit TShape2, TShape3 u.s.w.

Beim Programmstart ist THape1 grün, alle anderen sind schwarz.

Der Zufallsgenerator produziert alle 20 Millisekunden einen neuen Wert. Wenn dieser Wert gerade ist, soll das nächste TShape, also TShape2 grün werden und dafür TShape1 schwarz.
Ist der nächste Wert wieder gerade, wird TShape3 grün und TShape2 schwarz.
Das geht so lange im Uhrzeigersinn wie gerae Werte generiert werde.

Wir nun ein ungerader Wert generiert, wird TShape2 grün und TShape3 schwarz. Es ändert sich also die Richtung.

Mit einer einfachen if then else Weiche kann ich das nicht lösen.
Ich vermute, die richtige Funktion ist eine for while Schleife. Aber ich habe keine Ahnung wie ich die Daten da richtig reinpacken soll....

Wäre für jede Hilfe echt dankbar.

Viele Grüße
Erutan

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Zufallswert auf mehr als eine Möglichkeit anwenden

Beitrag von Linkat »

Hallo Erutan,
herzlich willkommen im Lazarusforum.

Ich verstehe dein Problem nicht. Du generierst eine Zufallszahl und prüfst, ob sie gerade oder ungerade ist. Je nachdem geht die Lampe rechts oder links an. Du brauchst also keine Schleife, sondern musst nur prüfen, ob die Zufallszahl gerade oder ungerade ist..

Code: Alles auswählen

if odd(zahl) then links else rechts;
In deinem Fall reicht aber auch ein Zufallszahlenbereich von 0 und 1 aus.

Code: Alles auswählen

if zahl=0 then links else rehts;
Ich hoffe das hilft dir weiter

Gruß,
Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

wp_xyz
Beiträge: 5167
Registriert: Fr 8. Apr 2011, 09:01

Re: Zufallswert auf mehr als eine Möglichkeit anwenden

Beitrag von wp_xyz »

Setze die 10 Shapes in ein Array und definiere einen ShapeIndex

Code: Alles auswählen

 
const
  NumShapes = 10;
var
  Shapes: array[0..NumShapes-1] of TShape;
  ShapeIndex: Integer;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Shapes[0] := Shape1;
  Shapes[1] := Shape2;
  // etc
end;
 
Die Shape mit dem Index=ShapeIndex wird grün, alle anderen schwarz dargestellt.

Erzeuge eine Zufallszahl:

Code: Alles auswählen

 
  zufall := Random(2);
 
Wegen der (2) werden nur zwei Zufallszahlen erzeugt, 0 oder 1. Bei einer 0 erniedrigst du den Shapeindex um 1; wenn dieser -1 wird, setzst du den Wert auf NumShapes-1 zurück. Dann zeichnest du alle Shapes neu. Bei einer 1 erhöhst du den Shapeindex um 1; wenn dieser NumShapes wird, machst du stattdessen bei 0 weiter. Wieder alles ausgeben. Dies setzt natürlich voraus, dass die Lampen im Uhrzeigersinn angeordnet sind.

Und noch eine Anmerkung zu Delphi 6: Ich bin nicht ganz sicher, aber Delphi 7 zumindest läuft wunderbar unter Win7, wenn man es nicht ins Programm-Verzeichnis installiert, sondern in jedes andere, in dem man Schreibrechte hat.

Erutan
Beiträge: 2
Registriert: Di 6. Aug 2013, 21:25

Re: Zufallswert auf mehr als eine Möglichkeit anwenden

Beitrag von Erutan »

Ahhhh, vielen herzlichen Dank. Das werde ich gleich mal ausprobieren.

Danke auch für den Tipp mit der (2)- Ich hatte nach einer Boolleanfunktion gesucht, nach dem Motto True or False aber keine gefunden. Daher hatte ich das mit den geraden und ungeraden Zufallszahlen überlegt.

Delphi 7 habe ich leider nicht. Unter Windows 7 lief Delphi 6 noch so gerae eben aber auch nur mit Fehlermeldungen. Jetzt habe ich Windows 8 und da kriege ich es nicht zum Laufen.

Antworten