![]() |
Re: Doppelte Zahlen beim Lotto Generator
Also mein Code ist getestet und funktioniert. Hab einfach jetzt ned eingerückt, sonst mach ich das schon immer.
|
Re: Doppelte Zahlen beim Lotto Generator
|
Re: Doppelte Zahlen beim Lotto Generator
nein, der Code sollte nicht ordnungsgemäß funtionieren:
isdouble:=False; muß for die Schleife, denn so wird nur die letzte Zahl geprüft. for J:=1 to 6 do du prüfst auf Zahlen, die es noch nicht gibt (funktioniert zwar, ist aber nicht schön). Und wozu 2 Schleifen?
Delphi-Quellcode:
procedure GenerateLottoNumbers;
var isdouble: Boolean; I, J: Integer; zahl: array[1..6] of Integer; begin; randomize; for I:=1 to 6 do begin repeat zahl[I]:=Random(49)+1; isdouble:=False; for J:=1 to I - 1 do isdouble:=isdouble or (zahl[I]=zahl[J]); until not isdouble; TLabel(FindComponent('Label'+IntToStr(I))).Caption:=ItToStr(zahl[I]); end; end; |
Re: Doppelte Zahlen beim Lotto Generator
Zitat:
Die erste Schleife [for i:=1 to 6 do zahl[i]:= random(49)+1;] war nur dazu gedacht, zu zeigen, wie man den Block abkürzen kann und hat mit dem eigentlichen Ansatz nichts zu tun. Um zu überprüfen, ob eine Zahl schon gezogen wurde, benutze ich das set, weil es schöner und wahrscheinlich schneller ist, einfach nur auf 'in Set' zu prüfen, als eine Schleife über alle schon gezogenen Zahlen zu machen, so wie du es in deinem Beispiel gemacht hast.
Delphi-Quellcode:
list: set of Byte;
i,j: integer; zahl: array[1..6] of byte; begin list:=[]; for i:=1 to 6 do begin repeat j:= random(49)+1; until (not (j in list)); zahl[i]:=j; list:= list+[j]; end; |
Re: Doppelte Zahlen beim Lotto Generator
Ups ... neee, dat war auf 3_of_8's Post bezogen °_°
Also auf ![]() Zitat:
|
Re: Doppelte Zahlen beim Lotto Generator
Guten Morgen, Allerseits.
Ich würde folgende Arrays anlegen: AlleZahlen : array[1..49] of byte; EineZiehung : array[1..7] of byte; // sofern eine Zeihung simuliert werden soll EinEinsatz : array[1..x] of byte; // wenn zufällig erzeugte Einsätze für x Zahlen erzeugt werden sollen; Jede erzeugt Zahl würde ich im Array AlleZahlen auf Null setzen, so dass ich bei der nächsten Zahl ganz einfach prüfen könnte, ob die Zahl bereits einmal erzeugt wurde. Das ganze so lange laufen lassen, bis die gewünschte Zahl von Zahlen erzeugt ist und abschließend das Array AlleZahlen wieder in den ursprünglichen Zustand verseten.
Delphi-Quellcode:
Ich habe das nur mal so schnell hingeschrieben und nicht getestet, weil ich im Büro kein Delphi auf dem Rechner habe, sollte aber klappen.
procedure Ziehung;
begin i := 1; repeat Ramdomize; zahl := random(49)+1; if AlleZahlen(zahl] <> 0 then begin EineZiehung[i] := zahl; // oder EinEinsatz[i] := zahl; AlleZahlen[i] := 0; inc[i]; end; until i = 7; // oder i = x für Einsätze mit x Zahlen for i := 1 to 49 do AlleZahlen[i] := i; end; mfg gfjs |
Re: Doppelte Zahlen beim Lotto Generator
Das selbe thema hatte ich vor kurzem in nem anderen Forum auch gesehen.
![]() |
Re: Doppelte Zahlen beim Lotto Generator
Bei 7 aus 49 noch kein wirkliches Problem, aber sobald sich die Anzahl der gezogenen Elemente vergrößert, führt die Random-Try-And-Error-Taktik immer mehr zur Endlosschleife hin. Permutationen würden sich dann eher anbieten, die bleiben immer linear.
[edit] @gfjs: Wenn du nur auf Ungleichheit zu 0 prüfst, kannst du gleich ein Boolean-Array verwenden. [/edit] |
Re: Doppelte Zahlen beim Lotto Generator
Lies dir diesen Thread
![]() Alle Vorschläge hier sind defakto falsch und betrachten das Problem nur ingenieurtechnisch und sind selbst dann nicht sonderlich elegant. Gruß Hagen |
Re: Doppelte Zahlen beim Lotto Generator
Das hab ich grad durch Zufall im Easy Delphi Helper gesehen. Dachte ich poste es mal, vielleicht hilfts ja.
Delphi-Quellcode:
procedure TMainForm.Button1Click(Sender: TObject);
var Zahlen: Array[1..49] of Boolean; i, z: Integer; begin for i:= 1 to 49 do Zahlen[i]:=false; for i:=1 to 6 do begin repeat z:=random(49)+1 until Zahlen[z] = false; Zahlen[z]:=true; end; Edit1.Text:=''; for i:=1 to 49 do if Zahlen[i] then Edit1.Text:=Edit1.Text+' '+Inttostr(i)+' '; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz