Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi bei Random niemals diegleiche Zahl Teil 2 (https://www.delphipraxis.net/7893-bei-random-niemals-diegleiche-zahl-teil-2-a.html)

Moyyer 23. Aug 2003 20:43


bei Random niemals diegleiche Zahl Teil 2
 
Hallo Alle Zusammen.

Ich habe mir aus der Fülle der Prozeduren die folgende herausgesucht.
Doch es gibt wie immer ein Problem. Wenn ich von 8 Zahlen 8 (in unterschiedlicher Reihenfolge) haben will (z.B 5,2,4,1,8,3,7,6) so hängt sich das Programm weg. Warum?
P.S. Die null darf nicht dabeisein.


Delphi-Quellcode:
procedure tForm1.Mischen;
var i, j, x: integer;
  function inarray(number: integer): boolean;
  var i : integer;
  begin
    result := false;
    for i := 0 to High(numbers) do begin
      if numbers[i] = number then begin
        result := true;
        Break;
      end;
    end;
  end;

begin
  randomize;
  SetLength(numbers, 0);
  while High(numbers) < 8 do begin//Anzahl Zahlen
    x := random(8) + 1;//Wertebereich  <--- es muss irgendwo hier was falsch sein, doch ich weis nicht was --->
    if inarray(x) = false then begin
       j := High(numbers) + 1;
       SetLength(numbers, j + 1);
       numbers[j] := x;
     end;
  end;
  {Caption := InttoStr(High(numbers));}
  ListBox1.Items.Clear;
  for i := 1 to High(numbers) do begin
    ListBox1.Items.Add(InttoStr(numbers[i]));
   end;
end;
[edit=Christian Seehase] Delphi-Tags gesetzt, bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

Moyyer 23. Aug 2003 20:45

Re: bei Random niemals diegleiche Zahl Teil 2
 
tschuldigung, irgendwas ist beim eintrag falsch gegangen. der smily muss eine 8 sein.

Christian Seehase 23. Aug 2003 20:51

Re: bei Random niemals diegleiche Zahl Teil 2
 
Moin Moyyer,

tausch' mal diese Zeile:

Delphi-Quellcode:
SetLength(numbers, j + 1);
gegen diese

Delphi-Quellcode:
SetLength(numbers, high(numbers)+1);
Wenn ich das richtig sehe vergrösserst Du sonst das array bei jedem Durchlauf um 2 Felder, und nicht um 1.

Was jetzt das Weghängen angeht:
Geh' doch mal im Einzelschritt durch und überwache dabei die Variableninhalte. Bei 8 Werten sollte das zu machen sein.

Moyyer 23. Aug 2003 20:59

Re: bei Random niemals diegleiche Zahl Teil 2
 
Ich ahb es ausgetestet doch leider kommt jetzt eine schöne zugriffsverletzungsfehlermeldung.

Code:
    x := random(9);//Wertebereich
Wenn ich die zeile so umändere kommen 8 zahlen zwischen 0 und 8 (keine 9) wenn ich nach der zeile den folgenden code reimache hängt sich das programm trotzdem weg, obwohl es zulässig ist.

Code:
if x = 0 then x := 1;

Christian Seehase 23. Aug 2003 21:59

Re: bei Random niemals diegleiche Zahl Teil 2
 
Moin Moyyer,

das mit dem Random hättest Du ja so lassen können.

Wie gesagt geh' doch mal im Einzelschritt durch und schau Dir mal an, was alles passiert.

Christian Seehase 23. Aug 2003 22:09

Re: bei Random niemals diegleiche Zahl Teil 2
 
Moin Moyyer,

sorry, ich hatte da auch einen Fehler gemacht :oops:

Es muss natürlich

Delphi-Quellcode:
SetLength(numbers, Length(numbers)+1);
heissen :?

Warum das Programm in der Schleife festhängt kann ich Dir auch sagen:
Du musst in der while-Zeile mal das High gegen Length austauschen.
Die Listbox-Schleife muss übrigens von 0 bis high laufen.

negaH 23. Aug 2003 22:16

Re: bei Random niemals diegleiche Zahl Teil 2
 
Delphi-Quellcode:
const
  Count = 8;

var
  Number: array of Integer;
  I,J,K,T: Integer;
  S: String;
begin
// Initialisierung
  SetLength(Numbers, Count);
  for I := 0 to High(Numbers) do Numbers[I] := I +1;

// Numbers Array vermischen
  for I := 0 to Count * Count -1 do
  begin
    J := Random(Count);
    K := Random(Count);

    T := Numbers[J];
    Numbers[J] := Numbers[K];
    Numbers[K] := T;  
  end;

// Ausgabe
  S := '';
  for I := 0 to High(Numbers) do
    S := S + IntToStr(Numbers[I]) + #13#10;
  SetLength(S, Length(S) -2);
 
  ListBox1.Items.Text := S;
end;
Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:05 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