Delphi-PRAXiS
Seite 6 von 7   « Erste     456 7      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zufallszahl ziehen ohne wiederholung (https://www.delphipraxis.net/128822-zufallszahl-ziehen-ohne-wiederholung.html)

globetrotter77 7. Feb 2009 23:36

Re: Zufallszahl ziehen ohne wiederholung
 
Zitat:

Zitat von jaenicke
Weil du die Variable Liste in der implementation Sektion deklariert hast. Damit ist diese nur innerhalb dieser Unit sichtbar. Du kannst die Variable unter public deklarieren, dann kannst du mit Form5.liste auch darauf zugreifen.

Lieber nicht!
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.

jaenicke 7. Feb 2009 23:38

Re: Zufallszahl ziehen ohne wiederholung
 
Diese Stilfragen sind bei dem Quelltext auch schon egal...

_frank_ 7. Feb 2009 23:43

Re: Zufallszahl ziehen ohne wiederholung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von jaenicke
Weil du die Variable Liste in der implementation Sektion deklariert hast. Damit ist diese nur innerhalb dieser Unit sichtbar. Du kannst die Variable unter public deklarieren, dann kannst du mit Form5.liste auch darauf zugreifen.

ist aber ein unsauberer Codestil von außen auf Variablen einer Klasse direkt zuzugreifen, dafür gibts Methoden oder zumindest properties. man sollte so wenig wie nötig von außen setzen, nach möglichkeit sollte sich die Klasse autark verhalten. z.b. eine Methode erstellen der man die nötigen Parameter übergibt, die die klasse für sich anwendet und weiterverabreitet.

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

globetrotter77 7. Feb 2009 23:47

Re: Zufallszahl ziehen ohne wiederholung
 
Zitat:

Zitat von jaenicke
Diese Stilfragen sind bei dem Quelltext auch schon egal...

nun ja! über den Stil müssen wir sicher nicht reden ... :)
aber vielleicht hilft es ja trotzdem, ein paar Tipps zu geben, wie es besser wäre

mr_emre_d 8. Feb 2009 03:44

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);

Marc. 14. Feb 2009 20:24

Re: Zufallszahl ziehen ohne wiederholung
 
@ mr_emre_d:
Auch eine Lösung, aber da finde ich meine doch persönlich viel eleganter, auch wenn sie hier irgendwie absolut keinen Nachklang fand. ;)

calculon 14. Feb 2009 21:25

Re: Zufallszahl ziehen ohne wiederholung
 
Zitat:

Zitat von walli18
Ich brauche dringend eure Hilfe!
Für ein Quiz was ich erstellt habe möchte ich eine zufallszahl bekommen wenn ich auf einen button klicke! Diese sollte von 1-40 gehen! Beim erneuten klicken auf den button sollte auch eine zufallszahl von 1-40 kommen, außer der, die ich vorher schon hatte! Das ganze will ich 15 mal ausführen, so dass jede frage nur einmal kommt! Jeder zahl von 1-40 ist eine Frage zugeordnet!
Doch wie mache ich das???
Ich bin ein echter anfänger und bräuchte deswegen ne einfache lösung oder nen kompletten Quelltext!
Für die antworten bedanke ich mich schonmal!!

Alternativ zu Marc.'s Vorschlag kannst du auch 'ne StringList nehmen. Diese auffüllen -> Zufällige Indizes generieren -> Den "gezogenen" Eintrag entfernen
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;

_frank_ 14. Feb 2009 23:16

Re: Zufallszahl ziehen ohne wiederholung
 
Zitat:

Zitat von calculon
Alternativ zu Marc.'s Vorschlag kannst du auch 'ne StringList nehmen. Diese auffüllen -> Zufällige Indizes generieren -> Den "gezogenen" Eintrag entfernen

wenn man es langsam möchte...
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

calculon 14. Feb 2009 23:49

Re: Zufallszahl ziehen ohne wiederholung
 
Zitat:

Zitat von _frank_
Zitat:

Zitat von calculon
Alternativ zu Marc.'s Vorschlag kannst du auch 'ne StringList nehmen. Diese auffüllen -> Zufällige Indizes generieren -> Den "gezogenen" Eintrag entfernen

wenn man es langsam möchte...
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

Tja, manche passen den Lösungsweg elegant der Aufgabenstellung an, die da lautet 15 Zufallszahlen aus 40 Einträgen jeweils genau einmal, zu ziehen ("Ergebnisorientiert"). Und andere wiederum ("Experten" ;-)) machen sich halt einfach gerne das Leben schwer. Wenn du tatsächlich in der Praxis einen Unterschied in der Geschwindigkeit merkst (für diese Aufgabenstellung wohlgemerkt), dann und nur dann geb' ich dir Recht. Aber ich weiß' schon, könnte ja mal erweitert werden müssen auf 10.000.000 einzigartigen Ziehungen aus 50.000.000.000 Einträgen...

Same old story, same old song! Don't go right, don't go wrong ;-)

_frank_ 15. Feb 2009 00:37

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 17:30 Uhr.
Seite 6 von 7   « Erste     456 7      

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