AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zufallszahl ziehen ohne wiederholung

Offene Frage von "walli18"
Ein Thema von walli18 · begonnen am 6. Feb 2009 · letzter Beitrag vom 17. Feb 2009
Antwort Antwort
Seite 6 von 7   « Erste     456 7      
globetrotter77

Registriert seit: 16. Jan 2009
Ort: Nürnberg
236 Beiträge
 
Delphi 10.3 Rio
 
#51

Re: Zufallszahl ziehen ohne wiederholung

  Alt 8. Feb 2009, 00:36
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#52

Re: Zufallszahl ziehen ohne wiederholung

  Alt 8. Feb 2009, 00:38
Diese Stilfragen sind bei dem Quelltext auch schon egal...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#53

Re: Zufallszahl ziehen ohne wiederholung

  Alt 8. Feb 2009, 00:43
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
Angehängte Dateien
Dateityp: zip inizugriff_155.zip (127,2 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
globetrotter77

Registriert seit: 16. Jan 2009
Ort: Nürnberg
236 Beiträge
 
Delphi 10.3 Rio
 
#54

Re: Zufallszahl ziehen ohne wiederholung

  Alt 8. Feb 2009, 00:47
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
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#55

Re: Zufallszahl ziehen ohne wiederholung

  Alt 8. Feb 2009, 04:44
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);
  Mit Zitat antworten Zitat
Benutzerbild von Marc.
Marc.

Registriert seit: 14. Mär 2008
Ort: Aachen
22 Beiträge
 
Delphi 2009 Professional
 
#56

Re: Zufallszahl ziehen ohne wiederholung

  Alt 14. Feb 2009, 21:24
@ 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.
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#57

Re: Zufallszahl ziehen ohne wiederholung

  Alt 14. Feb 2009, 22:25
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;
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#58

Re: Zufallszahl ziehen ohne wiederholung

  Alt 15. Feb 2009, 00:16
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
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#59

Re: Zufallszahl ziehen ohne wiederholung

  Alt 15. Feb 2009, 00:49
Zitat von _frank_:
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
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#60

Re: Zufallszahl ziehen ohne wiederholung

  Alt 15. Feb 2009, 01:37
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 )

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 7   « Erste     456 7      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:21 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