Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Doppelte Zahlen beim Lotto Generator (https://www.delphipraxis.net/66568-doppelte-zahlen-beim-lotto-generator.html)

3_of_8 31. Mär 2006 16:18

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.

marabu 31. Mär 2006 16:24

Re: Doppelte Zahlen beim Lotto Generator
 
Hier noch ein paar Anregungen: klick

Grüße vom marabu

himitsu 31. Mär 2006 17:16

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;

Nikolas 31. Mär 2006 18:07

Re: Doppelte Zahlen beim Lotto Generator
 
Zitat:

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?
Beziehst du dich auf meinen Post?

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;

himitsu 31. Mär 2006 18:21

Re: Doppelte Zahlen beim Lotto Generator
 
Ups ... neee, dat war auf 3_of_8's Post bezogen °_°

Also auf Beitrag #3 und
Zitat:

Zitat von 3_of_8
Also mein Code ist getestet und funktioniert. Hab einfach jetzt ned eingerückt, sonst mach ich das schon immer.

Und das SET ist hier auch nicht schlecht, aber sobald die Zahlen nicht zwischen 0 und 255 liegen wird es damit etwas schwer, bis unmöglich :)

gfjs 1. Apr 2006 07:23

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:
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;
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.

mfg gfjs

KLS 1. Apr 2006 07:49

Re: Doppelte Zahlen beim Lotto Generator
 
Das selbe thema hatte ich vor kurzem in nem anderen Forum auch gesehen.

http://forum.giga.de/showthread.php?t=698407

Khabarakh 1. Apr 2006 08:28

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]

negaH 1. Apr 2006 11:22

Re: Doppelte Zahlen beim Lotto Generator
 
Lies dir diesen Thread http://www.delphipraxis.net/internal...ct.php?t=10946 mal ganz genau durch.
Alle Vorschläge hier sind defakto falsch und betrachten das Problem nur ingenieurtechnisch und sind selbst dann nicht sonderlich elegant.

Gruß Hagen

Armageddon 1. Apr 2006 12:33

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 14:44 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz