Newsgroup: it.comp.lang.delphi
Titolo: Random Listbox

Ho un listbox che carica una serie di righe da un file .TXT.
Il listbox prevede solo due opzioni sorted: true/false (ordine 
alfabetico/ordine originale).
Secondo voi si può fare in modo che il listbox visualizzi i dati in ordine 
casuale (random)?
Enzo 

 casuale (random)?
si. li carichi in una tstringlist.
poi vedi la guida di tstringlist , dove è spiegato come usare
ordinamenti custom.
Poi, ne copi il contenuto nella listbox.
A


Non esiste una funzione che faccia questo, devi fartene una tu. Qualcosa 
del genere (non testato) :
procedure RandomizzaLista( L : TListBox );
var
   i, j, k, n : integer;
   s : string;
begin
   n := L.Items.Count;
   for k := 1 to n*n do
   begin
     // i, j casuali tra 0 e N-1 con i<>j
     i := random(n);
     repeat j := random(n) until i<>j;
     // swap tra elemento i e j
     s := L.Items[i];
     L.Items[i]:=L.Items[j];
     L.Items[j] := s;
   end;
end;
ciao
Giacomo

1) se al primo colpo i=j non fa un tubazzo
2) se i <> j per m volte, con m > n, fai m-n iterazioni inutili
debole.
A.

 debole.
A parte che vista la premessa "Qualcosa del genere (non testato)" piu' 
di tanto non si puo' pretendere (in effetti ho scritto a braccio), non 
capisco dove sta tutta la debolezza dell'algoritmo. O mi mi sfugge 
qualcosa o magari sfugge a te! :)
ciao
Giacomo

quello che mi sfugge e' la tipa del bar... ;-)))
cmq:
procedure RandomizzaLista( L : TListBox );
var
   l2: TStringList;
   n,x: integer;
begin
   l2 := tSTrigList.Create;
   try
   while true do begin
     n := l.count;
     if n = 0 then
       break;
     x := random(n);
     l2.add( l.strings[x]);
     l.remove(x)
   end;
   l.Text := l2.text
finally
   l2.free;
  end;
end;
A.

 del genere (non testato) :
Ha funzionato al primo colpo!
Per perfezionarla (l'ordine dovrebbe cambiare ad ogni avvio del programma) 
dovrei agganciare n*n a un valore mutevole, vero?
Per esempio ai minuti secondi dell'orologio di sistema?
Tipo: n*sec?


 Tipo: n*sec?
Dovresti inizializzare il seme del generatore casuale, usando la 
procedura Random(); una sola volta all'inizio del programma.
Cmq ti consiglio di utilizzare la procedura scritta da Alberto, che ha 
complessita' lineare mentre la mia quadratica.
Per ridurre la complessita' della mia dovresti cambiare n*n con un altro 
valore (n) ma in questo caso il rischio e' che i valori non vengano 
mescolati a sufficienta.
ciao
Giacomo

 procedure RandomizzaLista( L : TListBox );
[...]
ah, adesso ho capito! Tu in pratica riversi la prima lista nella seconda 
scegliendo di volta in volta in modo casuale quale copiare.
In effetti il tuo algoritmo e' solo o(n) mentre il mio e' quadratico 
(sindrome da bubble-sort?) e ma puo' diventare lineare modulando il 
numero di iterazioni da n*n a n, e in quel caso non so se la lista e' 
randomizzata per bene o rimane troppo simile all'originale...
ciao
Giacomo

 randomizzata per bene o rimane troppo simile all'originale...
infatti. x questo dicevo "è debole". senza offesa, eh?? :-)
A.

Non riesco a farla marciare...


enzoprof ha scritto:

Un pochino di modifiche che il buon Alberto x la fretta ha dato x 
scontato :)
Una form un button e un TlistBox
Sull'evento on click del bottone:
procedure TForm1.Button1Click(Sender: TObject);
   procedure RandomizzaLista(L : TListBox );
   var
     l2: TStringList;
     n,x: integer;
   begin
     l2 := TStringList.Create;
     try
     while true do begin
       n := l.count;
       if n = 0 then
         break;
       x := random(n);
       l2.add( l.Items[x]);
       l.Items.delete(x)
     end;
     l.Items.Text := l2.text
     finally
       l2.free;
     end;
   end;
begin
   randomize; // sarebbe da spostare nel create della appl
   RandomizzaLista(ListBox1)
end;
Cosi' dovrebbe funzionare
Saluti Goblin

ancora post da utenti finali?
sbaglio o questo è un ng di sviluppatori?
A.

 A.
dal Manifesto:
"Si vuole avere uno spazio di discussione per tutti quei programmatori (dal
meno esperto al piů avanzato) che vedono in Delphi una ottima alternativa
alla programmazione in Visual Basic."
Enzo 

> programmatori
^^^^^^^^^^^^^^^^^^^^^
 
A.

 Amichevolmente
Ricambio.
A

 procedura Random(); una sola volta all'inizio del programma.
Randomize
-- 
Mauro Falzari
"Chiamatemi Ismaele".
  (Herman Melville, in "Moby Dick", Londra 1851)

Chiarissimo.
Grazie.
Enzo
"Mauro Falzari" <mauro_...@despammed.com.invalid> ha scritto nel 
messaggio news:Xns9892A3BDA8F8110...@127.0.0.1...


 l2: TStringList;
MAI usare la 'l' minuscola seguita da numeri, si confonde facilmente con 1.
l2 sembra 12 :-)
-- 
Linux Counter 367009
Da ragazzo facevo i cento metri in otto secondi netti. Poi
purtroppo mi hanno fregato il motorino.