AGB  ·  Datenschutz  ·  Impressum  







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

Stringliste zufällig mischen

Ein Thema von kcx · begonnen am 18. Mär 2008 · letzter Beitrag vom 18. Mär 2008
Antwort Antwort
Seite 1 von 2  1 2      
kcx

Registriert seit: 19. Feb 2008
44 Beiträge
 
#1

Stringliste zufällig mischen

  Alt 18. Mär 2008, 13:09
Hallo,

Ich suche einen Code eine Stringliste möglichst schnell zu mischen.
Ich habe folgenden Code, der auch funktioniert, nur leider sehr langsam ist.

Delphi-Quellcode:
procedure Shuffle(List: TStrings);
var
  i: Integer;
begin
  Randomize;
  List.BeginUpdate;
  try
    for i := 0 to Pred(List.Count) do
      List.Exchange(i, Random(List.Count));
  finally
    List.EndUpdate;
  end;
end;
Kann man das auch schneller machen?

Danke
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Stringliste zufällig mischen

  Alt 18. Mär 2008, 14:13
Um welche TStrings Klasse handelt es sich genau ?
Ist es vielleicht das Property Lines von TMemo oder Items von TComboBox ?
Dann sind die Zugriff stark verlangsamt, da im Hintergrund Windows Messages verschickt werden.

Workararoud: alle Items auf eine echte TStringList kopieren, Daten verwürfeln und wieder zurückkopieren.
Andreas
  Mit Zitat antworten Zitat
kcx

Registriert seit: 19. Feb 2008
44 Beiträge
 
#3

Re: Stringliste zufällig mischen

  Alt 18. Mär 2008, 14:30
Zitat von shmia:
Um welche TStrings Klasse handelt es sich genau ?
Ist es vielleicht das Property Lines von TMemo oder Items von TComboBox ?
Dann sind die Zugriff stark verlangsamt, da im Hintergrund Windows Messages verschickt werden.
Es sind die Items einer ListBox.
Zitat von shmia:
Workararoud: alle Items auf eine echte TStringList kopieren, Daten verwürfeln und wieder zurückkopieren.
Habe ich schon probiert, ist aber leider genauso langsam.

Eine Möglichkeit wäre wohl der Umweg über ein String Array oder gibt es noch eine bessere Lösung?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Stringliste zufällig mischen

  Alt 18. Mär 2008, 14:39
Versuch mal spasseshalber, um zu Testen, ob die Random-Funktion die Bremse ist:
Delphi-Quellcode:
procedure Shuffle(List: TStrings);
var
  i: Integer;
begin
  Randomize;
  List.BeginUpdate;
  try
    for i := 0 to Pred(List.Count) do
      List.Exchange(i, (i*991+103) mod List.Count); // 991 & 103=Primzahl
  finally
    List.EndUpdate;
  end;
end;
Andreas
  Mit Zitat antworten Zitat
kcx

Registriert seit: 19. Feb 2008
44 Beiträge
 
#5

Re: Stringliste zufällig mischen

  Alt 18. Mär 2008, 14:59
Zitat von shmia:
Versuch mal spasseshalber, um zu Testen, ob die Random-Funktion die Bremse ist:
Delphi-Quellcode:
procedure Shuffle(List: TStrings);
var
  i: Integer;
begin
  Randomize;
  List.BeginUpdate;
  try
    for i := 0 to Pred(List.Count) do
      List.Exchange(i, (i*991+103) mod List.Count); // 991 & 103=Primzahl
  finally
    List.EndUpdate;
  end;
end;
Ist gut 200 ms schneller, also nicht wirklich viel.

So ist es zwar etwas umständlich, aber dafür sehr schnell:
Delphi-Quellcode:
procedure Shuffle3(List: TStrings);
var
  i, r: Integer;
  s: Array of String;
  t: String;
begin
  SetLength(s, List.Count);
  for i := 0 to Pred(List.Count) do
    s[i] := List[i];
  List.BeginUpdate;
  try
    List.Clear;
    for i := Low(s) to High(s) do
    begin
      //repeat
        r := Random(High(s));
      //until r <> i;
      t := s[i];
      s[i] := s[r];
      s[r] := t;
    end;
    for i := Low(s) to High(s) do
      List.Add(s[i]);
  finally
    List.EndUpdate;
  end;
end;
Werde es dann wohl doch so machen, Thx@All.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Stringliste zufällig mischen

  Alt 18. Mär 2008, 15:16
also ist einfach das exchange zu langsam?! Dann gibts noch bessere Möglichkeiten
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Stringliste zufällig mischen

  Alt 18. Mär 2008, 15:59
Hallo,

eine kleine Testprozedur:

TStringList.Exchange : 0ms
ListBox1.items.Exchange: 1060ms
Listbox über TStringList mischen: 109ms

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
  i : Integer;
  start : TDateTime;
begin
  sl := TStringList.create;
  for i:=0 to 9999 do
    sl.add(intToStr(i));
  ListBox1.Items.Assign(sl);

  // durchwürfeln

  start := now;
  for i:=sl.count -1 downto (sl.count - 1) div 2 do
    sl.Exchange(i,random(sl.count));
  showMessage('TStringList.Exchange: '+IntToStr(MilliSecondsBetween(now,start)));


  ListBox1.Items.BeginUpdate;
  start := now;
  for i:= ListBox1.Items.Count -1 downto (ListBox1.Items.Count -1) div 2 do
    ListBox1.Items.Exchange(i,random(ListBox1.Items.count));
  showMessage('TListBox.items.Exchange: '+IntToStr(MilliSecondsBetween(now,start)));
  ListBox1.Items.EndUpdate;

  start := now;
  sl.Assign(ListBox1.items);
  for i:=sl.count -1 downto (sl.count - 1) div 2 do
    sl.Exchange(i,random(sl.count));
  ListBox1.Items.Assign(sl);
  showMessage('TListBox über StringList.exchange: '+IntToStr(MilliSecondsBetween(now,start)));

  sl.free;
end;
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg

Registriert seit: 1. Jul 2007
155 Beiträge
 
#8

Re: Stringliste zufällig mischen

  Alt 18. Mär 2008, 16:23
Hi,

mischt doch nur die Indizes. Das dürfte die schnellste Methode sein.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Stringliste zufällig mischen

  Alt 18. Mär 2008, 16:25
Zitat von bigg:
Hi,

mischt doch nur die Indizes. Das dürfte die schnellste Methode sein.
Das macht .Exchange doch.

Hansa hatte freundlicherweise den Code von Exchange in diesem Thread in Beitrag #15 eingestellt.
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg

Registriert seit: 1. Jul 2007
155 Beiträge
 
#10

Re: Stringliste zufällig mischen

  Alt 18. Mär 2008, 16:29
Exchange ist doch imho eine SWAP-Funktion. Warum muss die Liste, also deren Strings umsortiert werden, es reicht doch wenn nur deren Index (Integer) "sortiert" wird.
  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 17:04 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