Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Doppelte Zahlen in Arrays finden (https://www.delphipraxis.net/2406-doppelte-zahlen-arrays-finden.html)

KeeN 21. Jan 2003 19:51


Doppelte Zahlen in Arrays finden
 
Hallo!

Ich hab grad ein Programm geschrieben, dass mir Zufallszahlen in ein Array abspeichert. Jetzt gehts darum Doppelte Zahlen zu filtern.

Frage: Wie stellt man das am effizientesten an? Das Array Stück für Stück zu durchsuchen dürfte wohl ziemlich uneffizient sein.

MfG
KeeN

MadMason 21. Jan 2003 19:55

wird dir aber wohl nichts anderes übrigbleiben
(verbessert mich wenn ich mich irre) aber ein anderer weg als "per hand" ist mir nicht bekannt
Delphi-Quellcode:
for i:= 0 to Length(array)-1 do begin
 for i2:= 0 to Length(array)-1 do begin
  if array[i2] = array[i] then begin
   //tu was
  end;
 end;
end;

Jan 21. Jan 2003 19:58

Hallo KeeN,
du solltest von Anfang an filtern bevor du ins array schreibst.
Schau dir mal diesen thread an:
http://www.delphipraxis.net/viewtopi...ghlight=random
Gruß
Jan

janjan 21. Jan 2003 20:14

Zitat:

Zitat von MadMason
wird dir aber wohl nichts anderes übrigbleiben
(verbessert mich wenn ich mich irre) aber ein anderer weg als "per hand" ist mir nicht bekannt
Delphi-Quellcode:
for i:= 0 to Length(array)-1 do begin
 for i2:= 0 to Length(array)-1 do begin
  if array[i2] = array[i] then begin
   //tu was
  end;
 end;
end;

ich würds eher so machen
Delphi-Quellcode:
for i:= 0 to Length(array)-1 do begin
 for i2:= [color=#f60000]i[/color] to Length(array)-1 do begin
  if array[i] = array[i2] then begin
   //tu was
  end;
 end;
end;

KeeN 21. Jan 2003 20:25

Jan's Vorschlag klingt am besten, find ich. In dem anderen Beitrag steht geschrieben:
Zitat:

Etwas besser ist es da (insbesondere bei noch größeren Bereichen) die gezogene Zufallszahl als Zähler in der Menge der noch nicht gefundenen Zahlen zu benutzen.
Ok. Und nun für Dumme :freak: :Wie stell ich das an, bzw. kann mir das einer mal etwas genauer erläutern?

KeeN

nailor 22. Jan 2003 00:09

Nimm doch statt nem Array ein Set. Das hat mit dem "in" Operator schon einen Membership-Test.

Also wenn, du wissen willst, ob die 5 in deinem Set ist, dann schreibst du einfach:

Delphi-Quellcode:
if 5 in DeinSet then ...

Hansa 22. Jan 2003 00:14

Hi,

die gezogene Zahl muß dann aber aus der Menge wenigstens raus, glaube Du brauchst nur
Code:
VorhandenesSet := VorhandenesSet - [gezogene Zahl]
zumindest so in dem Sinne. Die leere Menge muß dabei eventuell berücksichtigt werden.

Gruß
Hansa

jbg 22. Jan 2003 07:14

Und nun die Einschränkung von Sets:
Sets können max. 256 unterschiedliche Werte aufnehmen.

janjan 22. Jan 2003 07:34

bei großen arrays wäre es glaube ich sinnvoller und schneller die zahlen erst der größe nach zu sortieren und danach die liste einmal von oben nach unten durchzukucken:

Delphi-Quellcode:
for i:= 0 to Length(array)-2 do begin
  if array[i] = array[i+1] then
    begin
      DoSomething;
    end;
end;

MrSpock 22. Jan 2003 08:11

Hallo KeeN,

der Beitrag mit dem Nutzen der Zufallszahl als Zähler war von mir. Das Problem war ja, dass Privateer3000 Zufallszahlen ziehen wollte und doppelte vermeiden wollte. Er benötigt also eine zufällige Reihenfolge einer Menge von Zahlen. Mein Vorschlag bezog sich darauf, dass du anfangs eine Liste mit allen erlaubten Zahlen erzeugst. Das kann ein Array, eine Menge (Set) oder eine ring verkette Liste sein.

Wenn du eine Zufallszahl n gezogen hast, nimmst du das n-te noch nicht gezogene Element als neue Zahl und löscht dieses bzw. markierst es als gezogen, falls du ein Array benutzt. Die Lösung mit der ring verketteten Liste ist dabei wohl die flexibelste.

kylix.user 22. Jan 2003 09:56

Hi!

Da jedes Array indiziert ist, könntest Du doch auch mit den Indexen arbeiten.
(Habe z.Zt. kein Delphi hier - um keinen Syntaxfehler zu machen daher sehr abstrakt):

// Deklariere ein (dynamisches) Array mit Booleanwerten.


myBol: Boolean;

myBolArray: Array of myBol;


// das ganze Array müsste jetzt NIL-Werte enthalten!

Schleife begin

Zufallszahl := Random()

if legth(myBolArray) < Zufallszahl
setlength(myBolArray, X);

myBolArray[Zufallszahl) := True;

Schleife ende


// Nun kannts du das Array mit der Länge X sequenziell und vorallem sortiert auswerten.

for myZaehler := 0 to high(myBolArray) begin
if myBolArray[myZaehler] := true then
// das war eine Zufallszahl!



Müsste theoretisch funktionieren. Wenn Du anstatt Boolean auf z.B. Integer wechselst, könntest Du hinterher auch noch auswerten, an welcher Stelle welche Zahl gezogen wurde. Auch ein mehrdimensionales Array wäre denkbar!

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 Uhr.

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