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 |
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; |
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 |
Zitat:
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; |
Jan's Vorschlag klingt am besten, find ich. In dem anderen Beitrag steht geschrieben:
Zitat:
KeeN |
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 ...
|
Hi,
die gezogene Zahl muß dann aber aus der Menge wenigstens raus, glaube Du brauchst nur
Code:
zumindest so in dem Sinne. Die leere Menge muß dabei eventuell berücksichtigt werden.
VorhandenesSet := VorhandenesSet - [gezogene Zahl]
Gruß Hansa |
Und nun die Einschränkung von Sets:
Sets können max. 256 unterschiedliche Werte aufnehmen. |
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; |
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. |
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