Frage von bommel02020, 61

Wie kann ich an dieses Delphi programmier Problem lösen?

Hey, Ich soll als Hausaufgabe ein Programm programmieren (in Lazarus) das zu 100% zwei verschiedene Zufallszahlen generiert. Mein Ansatz ist an sich ganz leicht bloß leider komme ich mit Lazarus nicht zurecht. Und zwar lasse ich die 1. Zahl generieren und dann eine 2. und dann möchte ich prüfen lassen ob die 2. mit der 1. übereinstimmt. Wenn das der Fall ist soll eine neue Zahl generiert werden. Damit komme ich aber so gar nicht zurecht. Wäre super wenn sich da jemand mit auskennen würde und mir auch helfen könnte die Aufgabe zu lösen.

MFG bommel

Antwort
von ceevee, 61

und dann eine 2. und dann möchte ich prüfen lassen ob die 2. mit der 1. übereinstimmt.

Nein. Du möchtest solange eine zweite Zufallszahl generieren, bis sie nicht mit der ersten übereinstimmt. ;)

Wie sieht denn dein bisheriger Ansatz aus?

Kommentar von bommel02020 ,

Genau. Naja ich habs bis jetzt halt nur geschafft das das Programm 2 Zufallszahlen generiert im Bereich von 0-9.

Sieht also so aus.

procedure TForm1.Button1Click(Sender: TObject);

var z,x:Integer;

begin

randomize;

Edit1.Text:=IntToStr(z);

Edit2.Text:=IntToStr(x);

z:= random(10+1);

x:= random(10+1);

Kommentar von ceevee ,

http://www.delphi-treff.de/object-pascal/schleifen/

dementsprechend also

repeat

x:=random(10+1)

until x <> z

Übrigens müsstest du theoretisch die Zufallszahlen erst erzeugen und danach ausgeben.

Kommentar von bommel02020 ,

So ich habe jetzt mal was probiert und zwar :

procedure TForm1.Button1Click(Sender: TObject);

var z,x:Integer;

beginrandomize;

Edit1.Text:=IntToStr(z);

Edit2.Text:=IntToStr(x);

z:= random(10+1);

x:= random(10+1);

while z=x do

x:= random (10+1);

Problem hierbei: Ich bekomme beim 1. mal klicken 1 und 0 raus und danach auch nur noch 1 und 0 egal wie oft ich drücke. Wieso ?

Kommentar von bommel02020 ,

Und wie mache ich das das ich sie erst erzeuge und dann ausgebe. ?

Kommentar von ceevee ,

Und wie mache ich das das ich sie erst erzeuge und dann ausgebe. ?

Indem du umsortierst:

randomize;

z:= random(10+1);

x:= random(10+1);  // Ich glaub, die Zeile kann auch weg, aber das ist kein Fehler

while z=x do

x:= random (10+1);

Edit1.Text:=IntToStr(z);

Edit2.Text:=IntToStr(x);

Der Rest von deinem Code sieht soweit richtig aus, bloß die beiden Edit-Anweisungen musst du ans Ende der Funktion setzen. In deinem Codebeispiel oben schreibst du x und z zuerst in die Textfelder und danach weist du ihnen Zufallszahlen zu (die dann logischerweise nicht in den Textfeldern ausgegeben werden)

Kommentar von bommel02020 ,

Es funktioniert !!! Vielen Dank !!

Kommentar von ceevee ,

Gern geschehen. :)

Kommentar von bommel02020 ,

Eine Frage hätte ich noch und zwar:

Wenn ich jetzt die festgelegten Zahlenbereiche entferne, dann kommt bei mir eine Fehlermeldung und das Programm funktioniert nicht mehr. Wieso ist das dann so ?

Antwort
von wedck, 59

Wenn du mal einen Ansatz reinstellen kannst...?

Was hast du denn schon?

Kommentar von bommel02020 ,

Naja nicht gerade viel. Das hier bis jetzt.

 procedure TForm1.Button1Click(Sender: TObject);

var z,x:Integer;

beginrandomize;

Edit1.Text:=IntToStr(z);

Edit2.Text:=IntToStr(x)

;z:= random(10+1);

x:= random(10+1);

Kommentar von wedck ,

Da fehlt nur noch (Wenn ich mich nicht irre und dein Ansatz stimmt)


if (z==x)
{x= random (10+1);}


Kommentar von bommel02020 ,

Daran scheiter ich ja, ich weiß eben nicht wie ich das programmieren soll wenn x=y das y nochmal neu generiert wird.

anfangen würde ich ja mit

if x=y then

y= ???

Oder liege ich damit schon falsch ?

Kommentar von ceevee ,

Da könnte es passieren, dass nach der if-Bedingung die beiden Zufallszahlen immernoch gleich sind. Weil das innere random nochmal die selbe Zahl wie z ausspuckt.

Kommentar von wedck ,

Stimmt

Kommentar von bommel02020 ,

Achso ok also nehme ich am besten eine While-Schleife ?

Kommentar von wedck ,

Ja, eine While-Schleife empfielt sich hier, oder eine for-Schleife. Eine repeat-until-Schleife wäre ungeeignet. Also:


While (x=z)
{z:=random (10+1)}


Statt "While" ginge auch "for". Allerdings bin ich mir nicht sicher, ob es den Befehl "random(10+1)" so gibt.

Kommentar von bommel02020 ,

Naja ich habe das so nachgelesen das  der Befehel "random (10+1) halt nicht anderes ist als das random die Zufallszahl ist und die 10 den Werteparameter dieser Zufallszahlen angibt und die +1 einfavh damit es insgesamt 10 Zahlen sind die ausgewählt werden können.

Ich wunder mich nur weil ich das mit dem While x=Z

z:= random (10+1); genauso gemavht habe und da kommt halt immer nur 1 und 0 raus.

Kommentar von ceevee ,

Random(10+1) ist das gleiche wie Random(11) und erzeugt eine Zufallszahl zwischen 0 und 10. Wenn du eine Zufallszahl zwischen 1 und 10 willst, dann nimm lieber Random(10)+1 ;)

http://www.delphi-treff.de/tipps-tricks/mathematik/zahlen-und-zahlensysteme/zufa...

Kommentar von bommel02020 ,

Danke für den Tipp ! ;D

Kommentar von ceevee ,

repeat-until-Schleife ginge auch, hab ich in einen meiner Kommentare weiter oben auch gemacht. while ist aber tatsächlich am Besten.

for-Schleife wäre schlecht. Eine for-Schleife nimmt man, wenn man vorher weiß, wie oft die Schleife durchlaufen werden soll.

Kommentar von wedck ,

Hast du schon wieder recht. Ich bin ein bisschen aus der Übung anscheinend. :)

Keine passende Antwort gefunden?

Fragen Sie die Community