![]() |
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:
[edit=Christian Seehase] Delphi-Tags gesetzt, bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]
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; |
Re: bei Random niemals diegleiche Zahl Teil 2
tschuldigung, irgendwas ist beim eintrag falsch gegangen. der smily muss eine 8 sein.
|
Re: bei Random niemals diegleiche Zahl Teil 2
Moin Moyyer,
tausch' mal diese Zeile:
Delphi-Quellcode:
gegen diese
SetLength(numbers, j + 1);
Delphi-Quellcode:
Wenn ich das richtig sehe vergrösserst Du sonst das array bei jedem Durchlauf um 2 Felder, und nicht um 1.
SetLength(numbers, high(numbers)+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. |
Re: bei Random niemals diegleiche Zahl Teil 2
Ich ahb es ausgetestet doch leider kommt jetzt eine schöne zugriffsverletzungsfehlermeldung.
Code:
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.
x := random(9);//Wertebereich
Code:
if x = 0 then x := 1;
|
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. |
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:
heissen :?
SetLength(numbers, Length(numbers)+1);
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. |
Re: bei Random niemals diegleiche Zahl Teil 2
Delphi-Quellcode:
Gruß Hagen
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:59 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