AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Problem beim erzeugen von Zufallszahlen 100.000<
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beim erzeugen von Zufallszahlen 100.000<

Ein Thema von Hallo_Thomas · begonnen am 27. Jun 2005 · letzter Beitrag vom 30. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#1

Problem beim erzeugen von Zufallszahlen 100.000<

  Alt 27. Jun 2005, 00:51
Und zwar habe ich folgenes Problem, wenn bei diesen Befehl unten versuche 100.000 Zufallszahlen zu erzeugen, schaffe ich eine Rechnerauslastung von 99% und Speicherauslastung steigt, und die Zahlen werden erst nach ca. 2min dargestellt.
Während bei 10.000 Zahlen der Vorgang gerade mal 1,2s dauert!

Wie kann ich diesen Vorgang beschleunigen?






Delphi-Quellcode:
procedure TForm1.SpeedButton8Click(Sender: TObject);
Var Zahl,i :Integer;
    farbe :TColor;
begin
  randomize;
  for i:=1 to StrToInt64(Edit1.Text) do//////hier wird bestimmt wieviel Zz erzeugt werden
  begin
    Zahl :=random(7)+1;
    meineListe.Insert(0,IntToStr(Zahl));
    if Zahl in [1,37] then farbe := clblue else
    farbe := clyellow;
    Listbox1.Items.InsertObject(0,IntToStr(Zahl), Pointer(farbe));
  end;
end;
Angehängte Dateien
Dateityp: zip bpl_110.zip (17,9 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Nothine
Nothine

Registriert seit: 3. Jul 2004
Ort: Mülheim an der Ruhr
198 Beiträge
 
Delphi 5 Enterprise
 
#2

Re: Problem beim erzeugen von Zufallszahlen 100.000<

  Alt 27. Jun 2005, 01:35
Es ist sehr gut möglich das die reine Erzeugung der Zufallszahlen gar nicht mal so lange dauert, sondern vielmehr die Ausgabe in der ListBox. Ich würd zu diesem Zweck die ganze for-Schleife einfach mal in einen Delphi-Referenz durchsuchenBeginUpdate/Delphi-Referenz durchsuchenEndUpdate-Block einschließen. (selbiges gilt möglicherweise auch für "meineListe", je nachdem ob sie sichtbar ist)

edit: ach ja und nur der form halber, Randomize sollte man in aller Regel nur einmal beim Programmstart aufrufen (initialization oder OnFormCreate).
if ThisPost is senseless then
ThisPost.WasPostedBy := SomeoneElse();
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: Problem beim erzeugen von Zufallszahlen 100.000<

  Alt 27. Jun 2005, 01:36
Hallo,

zum Beschleunigen fallen mir da zwei Sachen ein:

Delphi-Quellcode:
ListBox1.Items.BeginUpdate; // <--
for i:=1 to StrToInt64(Edit1.Text) do//////hier wird bestimmt wieviel Zz erzeugt werden
begin
  Zahl :=random(7)+1;
  meineListe.Add(IntToStr(Zahl)); // <--
  if Zahl in [1,37] then farbe := clblue else
  farbe := clyellow;
  Listbox1.Items.InsertObject(0,IntToStr(Zahl), Pointer(farbe));
end;
ListBox1.Items.EndUpdate; // <--
Mit BeginUpdate/EndUpdate sagtst Du Windows, dass Du jetzt viele Sachen ändern möchtest und Windows sich vorerst raushalten soll (Sonst will Windows bei jeder Änderung die Listbox neu zeichnen).

Mit Add() statt Insert() sparst Du Dir jede Menge Speicheroperationen. Bei Insert müssen ja jedesmal sämtliche Referenzen nach hinten geschoben werden, damit vorne wieder Platz ist. Bei 100.000 Verschiebungen kommt da ganz schön was zusammen.

Gruß
xaromz
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Problem beim erzeugen von Zufallszahlen 100.000<

  Alt 27. Jun 2005, 01:50
Zitat von xaromz:
Delphi-Quellcode:
ListBox1.Items.BeginUpdate; // <--
for i:=1 to StrToInt64(Edit1.Text) do//////hier wird bestimmt wieviel Zz erzeugt werden
begin
  Zahl :=random(7)+1;
  meineListe.Add(IntToStr(Zahl)); // <--
  if Zahl in [1,37] then farbe := clblue else
  farbe := clyellow;
  Listbox1.Items.InsertObject(0,IntToStr(Zahl), Pointer(farbe));
end;
ListBox1.Items.EndUpdate; // <--
Wenn du nun auch noch statt
for i:=1 to StrToInt64(Edit1.Text) do for i := StrToInt64(Edit1.Text) downto 1 do schreibst, ist dein Code
1. nochmal etwas schneller, und
2. hast du sogar die gleiche reihenfolge der zufallszahlen wie bei deinem code.
(normalweiße egal da ja alle zahlen zufällig sind, es soll aber doch Leute geben für die mit random erzeugte zufallszahlen nicht zufällig sind)

Um wieder auf deinen Code zurück zu kommen:
Delphi-Quellcode:
...
Zahl :=random(7)+1;
...
if Zahl in [1,37] then farbe := clblue else // deine Zahl wird nie 37 sein
...
ob der code schneller wird, wenn du die 37 wegnimmst, weiß ich nicht, aber da der fall sowieso nicht eintrifft, würd ich sie rauslöschen.

gruss
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Problem beim erzeugen von Zufallszahlen 100.000<

  Alt 27. Jun 2005, 02:29
Moin moin,

brauchst du wirklich eine ListBox für die Einträge? (Ich kann mir nicht vorstellen,
dass jemand 100000 Einträge durchscrollt)
Wenn du im Programm nur die farbe + zahl brauchst, nehme doch nen array...
(Mit Begin + EndUpdate gehts bissel schneller, aber zufrieden wirst du nicht sein)

Delphi-Quellcode:
type
   TMyListe = Record
      Zahl : Integer;
      Farbe : TColor;
   end;

procedure TForm1.SpeedButton8Click(Sender: TObject);
Var i : Integer;
    MyListe : array of TMyListe;
begin
   randomize;
   for i:=1 to StrToInt64(Edit1.Text) do begin
      SetLength( MyListe, i );
      MyListe[Pred(i)].Zahl := random(7)+1;
      if MyListe[Pred(i)].Zahl in [1,3,7] then
         MyListe[Pred(i)].farbe := clblue
      else
         MyListe[Pred(i)].farbe := clyellow;
   end;
   ShowMessage('Fertig :o)');
   Finalize(MyListe);
end;
Wenn du hier 100000 einträgst und auf deinen button klickst,
bekommst du die meldung schon, wenn du die maus los lässt...

Ist es evtl. eine alternative?
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Problem beim erzeugen von Zufallszahlen 100.000<

  Alt 27. Jun 2005, 07:50
Hai x000x,

Zitat von x000x:
...
Delphi-Quellcode:
...
begin
   randomize;
   for i:=1 to StrToInt64(Edit1.Text) do begin
      SetLength( MyListe, i );
....
....
Es sollte in jedem Fall vermieden werden das Array innerhalb der Schleife zu vergrößern.
Wen ein Dyn-Array vergrößert wird passiert jedes mal folgendes:
1. Es wird neuer Speicher der benötigten größe reserviert
2. Die Daten werden vom alten Speicherbereich in den neuen kopiert
3. Der alte Speicherbereich wird freigegeben

Da ja vor dem durchlaufen der Schleife die notwendige größe des Arrays bekannt ist sollte dieses auch nur einmal gesetzt werden.

Ach ja: Dyn-Arrays beginnen immer beim Index 0. Ein SetLength(MyListe, 10) ist also ein Array [0..9] of MyListe. Das muss bei den zugriffen berücksichtigt werden.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

Re: Problem beim erzeugen von Zufallszahlen 100.000<

  Alt 27. Jun 2005, 07:57
Also besser so:
Delphi-Quellcode:
 // randomize; Ab ins onFormCreate damit !
      SetLength( MyListe, StrToInt64(Edit1.Text));
   for i:=0 to Pred (StrToInt64(Edit1.Text)) do
begin
      MyListe[i].Zahl := random(7)+1;
      if MyListe[i].Zahl in [1,3,7] then
         MyListe[i].farbe := clblue
      else
         MyListe[i].farbe := clyellow;
   end;
   ShowMessage('Fertig :o)');
   Finalize(MyListe);
(da sind auch die ganzen Pred()'s weg ...
  Mit Zitat antworten Zitat
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#8

Re: Problem beim erzeugen von Zufallszahlen 100.000<

  Alt 27. Jun 2005, 22:36
@ x000x

Sicherlich ist es etwas übertrieben alle 100.000 Zahlen darzustellen , sicherlich würden auch die letzten 20 Zahlen reichen, ich überlegst mir noch.


@jfheins,Sharky,x000x

Der Lösungsansatz ist meiner Meinung nach auf alle Fälle wesentlich besser!


Nun bin ich noch nicht ganz so bewandert wie kopiere ich die Zahlen von der Array MyListe in die Stringliste meineListe, Die bestimmung der Farben benötige ich nur für die Listbox zur besseren Unterscheidung? Hier folgt noch mal die Gleiche Frage, wie Füge/Kopiere ich diese Zahlen mit der Farbe in die Listbox ein?
  Mit Zitat antworten Zitat
Jarmen_Kell

Registriert seit: 17. Mär 2005
188 Beiträge
 
#9

Re: Problem beim erzeugen von Zufallszahlen 100.000<

  Alt 27. Jun 2005, 22:54
Das ist das Problem meiner Meinung nach.
Für die Ausgabe müsstest du das alles wieder hinüberkopieren und man hat imho nichts gewonnen.
Also zahlen in MyListe durchlaufen lassen und dann

Listbox1.Items.InsertObject(0,IntToStr(MyListe[I].Zahl), Pointer(MyListe[I].farbe));

Da brauch ich ja wohl keine Delphi Tags ....

Edit: Puh oder vielleicht geht das auch direkt mit Pointerchen. In diesem Fall wird ja vermutlich immer etwas neues reserviert ... oder ist das auch schon ein Pointer?
  Mit Zitat antworten Zitat
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#10

Re: Problem beim erzeugen von Zufallszahlen 100.000<

  Alt 28. Jun 2005, 20:29
Irgendwie bekomme ich die Zahlen immer noch nicht schneller in die Stringlist.


Kann man vielleicht die Zufallszahlen als String erzeugen?
IntToStr frisst ja doch ganz schön an Ressourcen.


MyListe[i].Zahl := IntToStr(random(7)+1);
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:28 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