Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Schleifen laufen endlos? [Delphi 7]
TRUCKERm - Mi 26.01.11 22:38
Titel: Schleifen laufen endlos? [Delphi 7]
Joah...diese schleife scheint endlos zu laufen...wieso?
Ich will das für FZ[1 bis 3] verschiedene zuffalswerte generiert werden.
totc ist 3
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| procedure Tform1.InitRQ; var svc,svx,zahl:integer; var bv:boolean; begin
bv:=false;
for svc:=1 to totc do begin randomize; repeat begin bv:=false; Zahl:=Random(totc)+1; bv:=true; for svx:=1 to totc do begin if FZ[svx] = Zahl then bv:=false; end; end; until bv=true; FZ[svc]:=zahl; end; end; |
[delphi]
Falls jemand eine Idee hätte wäre es super wenn er sie mit mir teilen würde.
Moderiert von
Gausi: Quote- durch Delphi-Tags ersetzt
platzwart - Mi 26.01.11 22:57
Naja, ganz offensichtlich ist 'Zahl' im Array 'FZ' enthalten...
bummi - Mi 26.01.11 23:01
randomize;
nur einmal im Programm aufrufen.
Mir erschließt sich der Sinn des ganzen nicht, aber wenn Du FZ mit 0 ern initialisiert läuft alles wie es soll.
TRUCKERm - Mi 26.01.11 23:05
bummi hat folgendes geschrieben : |
randomize;
nur einmal im Programm aufrufen.
Mir erschließt sich der Sinn des ganzen nicht, aber wenn Du FZ mit 0 ern initialisiert läuft alles wie es soll. |
Du musst bedenken, das ich warscheinlich den code so schwachsinnig wie es nur geht geschrieben habe.
Vielleicht kannst du das da für mich abändern oder kurz was neues schreiben?
Jedenfalls nochmal der Sinn:
FZ soll für die werte 1 bis totc (in diesem fall 3) eine zufällige Nummer zwischen 1 und totc erhalten die sich aber nicht wiederholen darf.
Datenpaare wie folgende sind möglich:
FZ[1]=2
FZ[2]=1
FZ[3]=3
usw.
Normalerweise soll das mit totc=36 Laufen, ich teste es gerade nur so mit totc=3.
TRUCKERm - Mi 26.01.11 23:08
platzwart hat folgendes geschrieben : |
| Naja, ganz offensichtlich ist 'Zahl' im Array 'FZ' enthalten... |
Mir fällt grad auf....das du Recht hast.
Ne idee wie ich das schreibe, sodass er nach allen Werten in FZ sucht außer nach der jetzigen?
Wäre das eine Option? (ich würds ja testen...aber ich glaube hier sind eh überall fehler drin...
Delphi-Quelltext
1: 2: 3: 4: 5:
| for svx:=1 to svc-1 do begin if FZ[svx] = Zahl then bv:=false; end; |
platzwart - Mi 26.01.11 23:11
Randomize nur ein einziges Mal aufrufen! Z.B. im OnCreate der Form...
TRUCKERm - Mi 26.01.11 23:16
Mache ich das so richtig? Ich kriege Access violation fehler....
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure Tform1.InitRQ; var i,j: Integer; tmp: TArrayElement; begin for i := Low(FZ) to High(FZ) do begin j := i +Random(Length(FZ) -i +Low(FZ)); tmp := FZ[j]; FZ[j] := FZ[i]; FZ[i] := tmp; end; end; |
bummi - Do 27.01.11 01:03
nimm's doch so wie beschieben
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| type TA=Array of Integer;
procedure ShuffleFisherYates(var aArray: TA); var i,j: Integer; tmp: integer; begin for i := Low(aArray) to High(aArray) do begin j := i +Random(Length(aArray) -i +Low(aArray)); tmp := aArray[j]; aArray[j] := aArray[i]; aArray[i] := tmp; end; end;
procedure TForm1.Button1Click(Sender: TObject);
var a:TA; i:Integer; begin SetLength(A,100000); for I := LOW(A) to High(A) do A[i] := i; ShuffleFisherYates(a); end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!