Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Zufallsgenerierte Zahlen nicht doppelt anzeigen


Kev - Di 05.12.06 21:59
Titel: Zufallsgenerierte Zahlen nicht doppelt anzeigen
Hey Leute, ich hätte da gerne mal ein Problem

Also wie soll ich sagen, ich mache mein Abi mit der Fachrichtung Datenverarbeitung und wir sollen einen Lottogenerator programmieren, bei dem nach zufallgenerierte zahlen zwischen 1 und 49 sich nicht wiederholen. Alles funktioniert, nur das sich die Zahlen alle zwei male wiederholen bzw. doppelt vorkommen.

Benötige ein bissl Hilfe.
Danke euch


Mit motorsportlichen Grüßen

Kev


jakobwenzel - Di 05.12.06 22:09

Bei so nem einfachem Thema Doppelpost, obwohls bestimmt min. 20 mal in der Suche drinsteht? :?

Hier steht die Lösung: (Problem ist zwar nich ganz das gleiche, aber die Lösung ist die gleiche)
http://www.delphi-forum.de/viewtopic.php?t=67263&highlight=


oldmax - Mi 06.12.06 10:48

Hi Kev, erstmal Willkommen.
@Jakob
sieh's nich so eng, er ist ganz frisch... :wink:
@Kev
Ok, Links sind auch Lösungsmethoden. Aber vielleicht hielft dir ein Wenig Denken. Was passiert so beim Lottozahlen ziehen:
49 Kugeln fallen in eine Trommel.
Eine nach der anderen wird herausgeholt, also ist nicht mehr in der Trommel drin.
Gut, wie packen wir es in ein Programm ?
Vielleicht so:

Delphi-Quelltext
1:
2:
3:
Var
   LottoList   : TStringlist; // Eine Stringliste deklarieren
   Zahlenfolge : TStringlist; // für die gezogenen Zahlen

Die Listen deklarierst du global.
In der Create-Methode deines Formulares initialisierst du dann diese beiden Listen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Procedure TMyForm.Create;
begin
  LottoList   := TStringlist.Create; // Initialisieren
  Zahlenfolge := TStringlist.Create; // Initialisieren

  ......

end;


Nun brauchst du die OnClick-Ereignismethode eine Buttons, um deine Lottozahlen in die Trommel zu kippen und 6 Zahlen wieder heraus zu ziehen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Procedure TMyForm.MyButton1Click(Sender : TObject); // Ziehung beginnen
Var i   : Integer;
    x   : Integer;
Begin
  LottoList.Clear; // Erstmal die Liste komplett leeren
  Zahlenfolge.Clear; // die auch
  For i :=1 to 49 do 
     LottoList.Add(IntToStr(i)); // 49 Kugeln in den Bottich werfen
  For i:=1 to 6 do               // wir ziehen automatisch 6 Zahlen
  begin
    x:=Random(49)+1-i; // 6 zufällige Zahlen, wobei der Inhalt deiner Liste kleiner wird
    ZahlenFolge.Add(Lottolist[x]); // Gezogene Zahl eintragen
    LottoList.Delete(x);           // und aus der Trommel entfernen
  end;
end;

So, nun hast du ein weiteres Gerüst und kannst ein bisschen verbessern und dran feilen. Wie du siehst, es ist einfach, Vorgänge nachzubilden, wenn man weiß, welche Komponenten geeignet sind.
Und nun viel Spass.