Newsgroup: it.comp.lang.delphi
Titolo: funzione random che funziona male

Ciao a tutti, riguardo al player mp3 che volevo fare (siamo a buon 
punto grazie alle risposte del post precedente),ora ho una lista di 
brani che mando in play però volevo che fosse random queto play e non 
seguendo la lista dal primo in avanti, quindi invece cha passargli il 
brano successivo gli passo il numero della riga relativa ricavato 
tramite la funzione Random(x), e funziona, però questo Random capita 
che genera  lo stesso numero anche 4 o 5 volte di fila, poi magari 
genera altri numeri; in pratica ho oltre 200 righe e pensavo che prima 
che si ripetessa un numero passato da poco ci volesse del tempo, invece 
no. Esiste un modo per risolvere questo problema? Al limite potrei 
aggiungere un segno di brano eseguito e se la fuinzione random mi da un 
numero che è già stato eseguito me ne genera un'altro, per ora non mi 
viene in mente altro. Qualche idea più sana della mia?? Grazie, ciao.
Inviato da 
www.mynewsgate.net

 ora non mi viene in mente altro. Qualche idea più sana della mia??
La tua idea va benissimo nel caso del random che non ripete mai le canzoni
fino all'ultima; altrimenti, se vuoi ripetere una canzone dopo tot canzoni
diverse suonate, devi usare una lista delle ultime tot canzoni o una roba
del genere.
-- 
Jax
====
La morte è la prima notte di quiete perché, si sogna senza sogni.

 viene in mente altro. Qualche idea più sana della mia?? Grazie, ciao.
Devi necessariamente tenere traccia delle canzoni appena suonate per
evitare di riprodurre nell'immediato nuovamente la stessa canzone.
Tip: 
http://maxxdelphisite.free.fr/mbrowser.htm
Antonio
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

scritta di getto:
...
l := tstringlist.create;
s := tstringlist.create;
randomize;
for i:= 0 to pred(maxbrani) do
   l.add(inttostr(i));
while true do
begin
   Indice := random(l.count);
   s.add(l.strings[indice]);
   l.delete(indice);
   if l.count < 1 then
     break
end;
....
AS

>viene in mente altro. Qualche idea piů sana della mia?? Grazie, ciao.
Non hai bisogno solo di un algoritmo "random": hai bisogno di un algoritmo
di "shuffle". Devi in pratica "mischiare" la lista come fosse un mazzo di
carte, poi leggere la lista in sequenza. In questo modo suoni le canzoni
in ordine casuale una sola volta, giunto alla fine puoi ripetere
l'operazione. Qualcosa tipo:
procedure ShuffleList(List : TList);
var
  Index: integer;
  RandomIdx: integer;
  TempPtr: pointer;
begin
  for Index := List.Count - 1 downto 1 do
  begin
    RandomIdx := Random(Inx + 1);
    if (RandomIdx <> Index) then
    begin
      TempPtr := List[Index];
      List[Index] := List[RandomIdx];
      List[RandomIdx] := TempPtr;
    end;
  end;
end;
E ricordati di chiamare Randomize per inizializzare il generatore di
numeri causuali...
Luigi D. Sandon - D&amp;D Support Team
--- posted by geoForum on 
http://www.delphiedintorni.it

    RandomIdx := Random(Inx + 1);
va scritta:
 
     RandomIdx := Random(Index + 1);
:)



io potrei dirti di ricavarti l'ora o la data del sistema..trasformarlo in 
Integer e fare il random da li!
cosi č sempre diverso!
č uno dei tanti modi :P
Federico


 Federico
Andrea

>cosi è sempre diverso!
Pura illusione. Un algortimo "random" genera una sequenza di numeri
pseudocasuali con una certa distribuzione statistica. Anche
reinizializzando il seme tutte le volte la probabilità che lo stesso
numero esca un certo numero di volte non è poi così bassa.
Se dati n elementi volete estrarli in ordine casuale *una volta sola*
dovete mischiarli e poi estrarli uno per volta, e non estrarli, rimetterli
nel mucchio e poi prenderne un altro.
Ma Knuth o libri simili sulla programmazione algoritmica non li legge
proprio più nessuno????!!!!!


Pura illusione. Un algortimo "random" genera una sequenza di numeri
Il random su un pc e' una chimera...
(della serie: la puttanata del giorno l'ho detta, ora me ne sto zitto)
:D
-- 
Morde. 
(
mo...@despammed.com
)
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

Grazie per le varie idee, ho fatto diverse prove e sono giunto alla 
conclusione seguente:
dopo che ho assegnato il brano con il random, sposto il suddetto brano in 
una lista dei brani già ascoltati e cancello quella riga dalla lista dei 
brani da ascoltare, in questo modo frego il random che se mi genera lo 
stesso numero, in quel punto c'è un nuovo brano; inoltre ho la lista 
delle canzoni da ascoltare e di quelle già ascoltate.
Grazie davvero ancora.
Inviato da 
www.mynewsgate.net

 Grazie davvero ancora.
la funzione <random>  ha ragione di essere anche xchè esiste la funzione 
<randomize> che crea un seme (seed) x il <random> appunto.
se tu provi una cosa del genere:
function getMusic: Integer;
begin
  randomize;
   getMusic := random(MaxInt);
end;
ottieni un nuovo seme ogni volta, così puoi riascoltare le canzoni anche + 
volte ma diminuisci le probabilità di riascoltare di seguito le stesse 
canzoni (e non è male).