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 user profile iconGausi: 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

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
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.


jaenicke - Mi 26.01.11 23:07

Fülle das Array mit den Zahlen 1..totc ubd mische es dann, fertig...
http://www.delphi-library.de/topic_perfektes+Mischen+nach+FisherYates+perfect+shuffle_71713.html


Gausi - Mi 26.01.11 23:08

Du suchst also eine zufällige Verteilung der Zahlen 1 bis 36? Also einmal das Array gründlich durchmischen? Dann schau dir mal dieses Topic [http://www.delphi-library.de/viewtopic.php?t=71713] an. :D

Argh. Da war Sebastian wieder schneller. :motz:


TRUCKERm - Mi 26.01.11 23:08

user profile iconplatzwart hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Du suchst also eine zufällige Verteilung der Zahlen 1 bis 36? Also einmal das Array gründlich durchmischen? Dann schau dir mal dieses Topic [http://www.delphi-library.de/viewtopic.php?t=71713] an. :D

Argh. Da war Sebastian wieder schneller. :motz:

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;