[RoLUG] codice random banner

Enrico Marchetto rolug@lists.linux.it
Fri, 21 Mar 2003 13:24:47 +0100


Alle 19:19, giovedì 20 marzo 2003, Roccatello Eduard ha scritto:
> Questo è il codice che ho prodotto per la rotazione causale dei banner.
 [cut]
>
> si accettano critiche e consigli.
> per chi non lo avesse capito quel codice è ASP :-P

Ciao a tutti.
Mi permetto di suggerire qualcosa.
Una ottimizzazione "veloce" potrebbe essere quella di calcorare il valore di 
pesoTot solo quando effettivamente cambi il numero o il peso dei banner, e 
non ad ogni rilettura della pagina. La cosa rimane comunque O(n), ma in 
questo modo l'effettiva scansione di TUTTI i banner avviene solo se rndBanner 
è alto e va a pescare l'ultimo banner.

Poi un'altra idea, che forse è una stronzata ma la dico lo stesso così mi dite 
che ne pensate. Se Eduard ha la possibilità di accedere ad un preciso banner 
in modo casuale (una cosa tipo:

BM_rs.moveTo(31)

e non

for(int i = 0; i < 32; i++)
   BM_rs.Movenext

) allora magari si può sprecare un po' di memoria del server per fare la cosa 
in tempo O(1). Intanto si fa in modo che pesoTot abbia valore ragionevole (es 
max 100, 200) e si crea un array di interi (pardon, di Variant in mondo 
MSBasic :-( che schifo!!) con dimensione pesoTot. Poi si riempie l'array in 
questo modo(pseudocodice):

oldIndex = 0;
i = 0;
do while not BM_rs.EOF
{
           peso = BM_rs("peso")
           bannerID = numero del record che contiene il banner
           oldIndex = i
           do while (i < peso + oldIndex)
               {
                array[i] = bannerID
                i++;
                }
           BM_rs.Movenext
}
loop

Insomma riempio le celle di array con riferimenti al numero del record di un 
certo banner, tante volte quanto il peso di quel banner (anche qui il peso 
deve essere un numero ragionevole, o al limite lo si "normalizza". In ogni 
caso la somma dei pesi deve dare pesoTot). Poi nella pagina che contiene i 
banner si mette una cosa tipo:

                 Randomize
                 rndBanner = int(rnd * pesoTot)
                 bannerIndex = array[rndBanner]
                 myBanner = BM_rs.MoveTo(bannerIndex)

Semplice e veloce; O(1) il reload della pagina e O(n), anche se laborioso, la 
creazione dell'array(che tanto la fai una volta sola).
What do you say?
           Enrico