AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wert aus Array entfernen

Ein Thema von Walgo · begonnen am 1. Mär 2008 · letzter Beitrag vom 2. Mär 2008
Antwort Antwort
Seite 2 von 2     12   
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#11

Re: Wert aus Array entfernen

  Alt 2. Mär 2008, 09:54
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:
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;
Freundliche Grüße
  Mit Zitat antworten Zitat
Walgo

Registriert seit: 1. Mär 2008
5 Beiträge
 
#12

Re: Wert aus Array entfernen

  Alt 2. Mär 2008, 10:06
Alles klar,
ich glaube jetzt hab ichs ^^,
danke für die schnelle Antwort

gruß walgo
  Mit Zitat antworten Zitat
Walgo

Registriert seit: 1. Mär 2008
5 Beiträge
 
#13

Re: Wert aus Array entfernen

  Alt 2. Mär 2008, 14:45
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:
 SetLength(werte,49);
 for i:= 0  to 48 do werte[i]:=i+1;
Nach meiner Vorstellung hat er jetzt die Indexzahlen 0-48, denen die Werte 1-49 zugeteilt sind.

Code:
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;
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!!

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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#14

Re: Wert aus Array entfernen

  Alt 2. Mär 2008, 15:36
Zitat von Walgo:
... marabu - das Problem bei deiner Prozedur ist, dass die Funktion
"RandomFrom()" nur einen Array annimt, etwas wie "(Gesamt - i)" funktioniert leider nicht ...
Deshalb habe ich Random() verwendet und nicht RandomFrom(). Ich will ja den Index und nicht den Wert.

Zitat von Walgo:
... Nach meiner Vorstellung hat er jetzt die Indexzahlen 0-48, denen die Werte 1-49 zugeteilt sind. ...
Das ist korrekt.

Zitat von Walgo:
... 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!!...
Du musst ganz klar unterscheiden zwischen der Position und dem Wert der Zufallszahl. RandomFrom() liefert dir einen Wert und kurz darauf verwendest du den Wert als Basis für einen Index. Das muss früher oder später schief gehen.
  Mit Zitat antworten Zitat
Walgo

Registriert seit: 1. Mär 2008
5 Beiträge
 
#15

Re: Wert aus Array entfernen

  Alt 2. Mär 2008, 16:36
Juhu, ich habs geschafft

Bin jetzt endlich fertig, falls es interessieren sollte hier nochmal der entgültige Code:
Code:
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;
Vielen Dank nochmal für die tolle Hilfe!

Grüße Walgo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 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