![]() |
Re: Zufallszahl ziehen ohne wiederholung
Zitat:
Wenn das Teil in zwei oder mehr Formularen benutzt wird, sollte es in einer extra Unit und nur dort definiert werden, das von allen mit uses aufgenommen wird. Dort und ebenfalls nur dort sollte dann auch eine Procedure für den Neuaufbau implementiert werden. Außerdem am besten auch gleich eine Function, die die gezogene Nummer zurückgibt. Alle anderen Vorkommen von liste gehören dann rausgeschmissen! PS: wenn eine Deklaration so wie beschrieben in eine untergeordnete Unit ausgelagert wird, sollte sie einen etwas aussagekräftigeren Namen als liste bekommen. Damit vermeidet man Mehrfach-Deklarationen, zumindest, wenn man nicht weiter in alle Himmelsrichtungen rumkopiert. |
Re: Zufallszahl ziehen ohne wiederholung
Diese Stilfragen sind bei dem Quelltext auch schon egal...
|
Re: Zufallszahl ziehen ohne wiederholung
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
er soll etwas sinnvolles lernen und nicht seinen Stil noch schlimmer machen...nebenbei bemerkt, hab ich ihm mal ein Beispielprogramm geschrieben, welches ihm zeigt, wie man das ganze mit ~250 Zeilen Quellcode hinbekommt (+externe Fragenaufbewahrung). und da solche Frage-Antwort-Programme schon häufiger ein Thema waren, mal mein Programm im Anhang. aber an alle Anfänger: nicht nur blind kopieren, sondern verstehen :) Gruß Frank |
Re: Zufallszahl ziehen ohne wiederholung
Zitat:
aber vielleicht hilft es ja trotzdem, ein paar Tipps zu geben, wie es besser wäre |
Re: Zufallszahl ziehen ohne wiederholung
Delphi-Quellcode:
type TIntArr = Array of Integer;
... function _Random( Range: Integer; var List: TIntArr ): Integer; var i, x: Integer; begin if Length(List) = 0 then begin SetLength(List, Range); for i := 0 to High(List) do List[i] := i; end; x := Random(Length(List)); Result := List[x]; for I := x+1 to High(List) do list[i-1] := list[i]; SetLength( List, High(List) ); end; ... // der wert "range" wird nur beim ersten aufruf benutzt, und wenn die liste leer ist // wird sie halt neu initialisiert :P // --Klatsch ne Memo und nen Button auf die Form und im OnClick Ereignis schreibst du // --folgendes var x: Integer; i: Integer; begin x := _Random( StrToInt(Edit1.Text), Numbers ); Memo1.Clear; for i := 0 to High(Numbers) do Memo1.Lines.Add( inttostr(i+1) + '.'#9 + IntToStr(Numbers[i]) ); Caption := 'Random Number - ' + IntToStr(X); |
Re: Zufallszahl ziehen ohne wiederholung
|
Re: Zufallszahl ziehen ohne wiederholung
Zitat:
Wie beim Lotto halt...
Delphi-Quellcode:
Procedure Sproideldoing;
var Pottich: TStringList; i, z: integer; begin Pottich := TStringlist.Create; try for i := 1 to 40 do Pottich.Add(IntToStr(i)); for i := 1 to 15 do begin z := random(Pottich.Count); ShowMessage(IntToStr(Pottich[z])); Pottich.Delete(z); end; finally Pottich.Free; end; end; |
Re: Zufallszahl ziehen ohne wiederholung
Zitat:
bitte zahlen nicht in stringlisten verwalten. das ist performancemäßig das ungünstigste, was man machen kann... das sinnvollste der bisherigen Vorschläge ist imho das vermischte array, da es ohne löschen auskommt. da dürfte noch nichtmal eine TList (mit auf TObject gecasteten Integern) rankommen, da es egal ist, ob die Integer-Daten selbst oder Pointer darauf (beides 32-bit-Werte) vertauscht werden. Bei anderen Datentypen dürfte TList schneller sein. Gruß Frank |
Re: Zufallszahl ziehen ohne wiederholung
Zitat:
Same old story, same old song! Don't go right, don't go wrong ;-) |
Re: Zufallszahl ziehen ohne wiederholung
das mit der Performance war nur als Randbemerkung gemeint...es geht hauptsächlich darum, einen passenden Datentyp zu wählen.und zur Verwaltung von Zahlen ist Stringlist nun mal ungeeignet.
Findest du, dass der Ansatz mit dem vermischten array schwerer war? Bei der Verwaltung in einer TList wäre der Code fast genauso wie deiner, nur dass du die Konvertierung sparst und es wesentlich schneller gehen dürfte. Der Lösungsansatz an sich war ja nicht falsch, nur das falsche Werkzeug. du nimmst ja auch nicht die Blumenschaufel (lag gerade griffbereit), um Schnee zu schippen, oder? auch wenns nur die Ausfahrt ist...geht auch, dauert halt nur bisschen länger (blöder Vergleich, aber mir fiel grade nix besseres ein :D) Deine Bemühungen zu helfen möchte ich natürlich anerkennen :) ich bin kein Experte (programmiere auch nur als Hobby),aber das sollte Grundwissen sein. Gerade gegenüber Anfängern sollte man da schon bisschen drauf achten, finde ich...es muss nicht der optimalste Code sein, aber unnötige Typ-Konvertierungen verwirren mehr als das sie nutzen. Gruß Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 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 by Thomas Breitkreuz