![]() |
Re: Wert aus Array entfernen
Moin,
du möchtest nach der Ziehung einer Zufallszahl die nachfolgenden Zahlen im Vektor werte aufrücken lassen. Die Zuweisungen innerhalb deiner WHILE-Schleife sind in Ordnung, aber die Bedingung im Schleifenkopf stimmt nicht, da musst du noch dran feilen: Zuerst solltest du dir die Position der aktuellen Zufallszahl merken, dann alle nachfolgenden Werte um eins nach vorne verschieben. Wenn du dir die Zufallszahl nicht merkst, dann brauchst du eine Schleife über den ganzen Vektor, in der zuerst die Stelle anhand des Wertes gesucht und ab dort jeder Wert verschoben wird. In meinem Beitrag #4 habe ich dir einen Ansatz beschrieben, bei dem du auf das mehrfache Verschieben und die Verkürzung des Vorratsvektors und die damit einhergehende Neuzordnung des Speicherbereiches verzichten kannst:
Delphi-Quellcode:
Freundliche Grüße
function Ziehung(const Anzahl, Gesamt: Integer): {Types.}TIntegerDynArray;
var i, iRandom: integer; Vorrat: TIntegerDynArray; begin SetLength(Vorrat, Gesamt); // Vorrat dimensionieren for i := Low(Vorrat) to High(Vorrat) do Vorrat[i] := Succ(i); // Vektor initialisieren SetLength(Result, Anzahl); // Ergebnis dimensionieren for i := Low(Result) to High(Result) do begin // Soviele Zahlen übernehmen wie nötig iRandom := Random(Gesamt - i); // Zufällige Position auswählen Result[i] := Vorrat[iRandom]; // Zahl an dieser Position übernehmen Vorrat[iRandom] := Vorrat[High(Vorrat) - i]; // Letzte Zahl an diese Position verschieben end; BubbleSort(Result); // Aufsteigende Sortierung end; |
Re: Wert aus Array entfernen
Alles klar,
ich glaube jetzt hab ichs ^^, danke für die schnelle Antwort :P gruß walgo |
Re: Wert aus Array entfernen
Also ich bin schonmal einen Schritt weitergekommen.
Ich wollte aber nochmal bei Arrays bleiben - zumindest für heute ^^ marabu - das Problem bei deiner Prozedur ist, dass die Funktion "RandomFrom()" nur einen Array annimt, etwas wie "(Gesamt - i)" funktioniert leider nicht :-( So sieht mein "Werte"-Array aus:
Code:
Nach meiner Vorstellung hat er jetzt die Indexzahlen 0-48, denen die Werte 1-49 zugeteilt sind.
SetLength(werte,49);
for i:= 0 to 48 do werte[i]:=i+1;
Code:
Blöderweise produziert er immernoch einen Fehler, jedoch sehr merkwürdig, beim ersten Starten funktioniert es IMMER, erst, wenn ich mehrere Male die Geschichte laufen lasse produziert er irgentwann eine Exception!!
for i := 0 to 5 do
begin zw:= RandomFrom (werte); //"berechnen" zuer Zufallszahl zufall[i]:= zw; //speichern in zw.. werte[zw-1]:=length(werte); //ersetzten der gezogenen Zahl (Bsp. 35 -> ich brauche den Index 34) durch die letzte Zahl, also falls es die erste Zahl ist - 49 (Index 48) SetLength(werte,length(werte)-1); // Löschen der letzten Zahl, damit diese nicht 2mal im Array vorkommt end; Ich hab echt keinen Plan warum der immer meckert, vor allem, warum es manchmal klappt und manchmal nicht, kennt das jemand von euch? grüße walgo |
Re: Wert aus Array entfernen
Zitat:
Zitat:
Zitat:
|
Re: Wert aus Array entfernen
Juhu, ich habs geschafft :P
Bin jetzt endlich fertig, falls es interessieren sollte hier nochmal der entgültige Code:
Code:
Vielen Dank nochmal für die tolle Hilfe!
for i := 0 to 5 do
begin zw2:= 49 - i; //Jede "runde" gibt es eine Möglichkeit weniger, deshalb "-i" zw:= Random (zw2); //hier wird nicht der wert, sondern nur der Index //(des "Werte-Arrays") einer Zahl gezogen zufall[i]:= werte[zw]; // Aus dem "Werte-Array" wird jetzt die zu dem Index //gehörende Zahl "herausgeholt" werte[zw]:=49-i; //der gezogene Wert wird durch den "letzten Wert, //der diese Runde gezogen werden konnte" ersetzt, //nächste Runde wird i um eins //erhöht und die hier doppelt besetzte Zahl //ist wieder nur einmal da! end; Grüße Walgo |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:25 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