[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