/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Vægtet tilfældighed (MySQL)
Fra : Niels Andersen


Dato : 13-07-02 20:47

Jeg skal lige bakse et simpelt banner-system sammen til en hjemmeside, men
har et lille problem.

Der skal vises et tilfældigt banner. Men *helt* tilfældigt skal det nu ikke
være. De bedste bannere skal vises oftest.

Jeg kunne forestille mig et felt med vægt, hvor dobbelt vægt giver dobbelt
så stor sandsynlighed for udvælgelse.

Man kunne også angive det i procenter el. lign, fx. at en vægt på 0.25
betyder at den bliver valgt gennemsnitligt hver 4. gang. Det lyder bare
besværligt at vedligeholde, da det så hele tiden skal give 1 eller 100 i
alt. I øvrigt ville det system da vist også virke, selv om der er
programmeret til den førstnævnte metode.

Men jeg aner ikke hvordan jeg skal gribe det an. :)
Nogen ideer?

Jeg kan godt komme i tanker om en omstændig løsning, som foregår uden for
databasen (henter først en liste over id'er og vægte, og finder en
tilfældig id med en tosset algoritme), men jeg synes det er så fjollet, at
der må da være noget bedre. :)

--
Mvh.

Niels Andersen
(la nels. anersyn.)

 
 
Niels Andersen (15-07-2002)
Kommentar
Fra : Niels Andersen


Dato : 15-07-02 10:53

Niels Andersen wrote in <Bs%X8.2599$Yf1.182161@news010.worldonline.dk>:
> Der skal vises et tilfældigt banner. Men *helt* tilfældigt skal det nu
> ikke være. De bedste bannere skal vises oftest.
>
> Jeg kunne forestille mig et felt med vægt, hvor dobbelt vægt giver dobbelt
> så stor sandsynlighed for udvælgelse.

Der kom ikke meget svar her, så jeg spurgte i videnskabsgruppen efter en
algoritme. Jeg fik et par muligheder, og én af dem kunne jeg lave i en
SQL-query:

SELECT id FROM tabel WHERE RAND()*12<weight ORDER BY RAND() LIMIT 1

Jeg har her defineret vægt-skalaen til at gå fra 0-12. (hvor 0 er "skal
slet ikke udvælges").

Der er en teoretisk risiko for, at der ikke kommer nogen resultater, så
lige den ene ting må jeg tage hensyn til i programmet.

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Nis Jorgensen (15-07-2002)
Kommentar
Fra : Nis Jorgensen


Dato : 15-07-02 13:41

On Mon, 15 Jul 2002 11:53:12 +0200, Niels Andersen
<niels-usenet@myplace.dk> wrote:

>Niels Andersen wrote in <Bs%X8.2599$Yf1.182161@news010.worldonline.dk>:
>> Der skal vises et tilfældigt banner. Men *helt* tilfældigt skal det nu
>> ikke være. De bedste bannere skal vises oftest.
>>
>> Jeg kunne forestille mig et felt med vægt, hvor dobbelt vægt giver dobbelt
>> så stor sandsynlighed for udvælgelse.
>
>Der kom ikke meget svar her, så jeg spurgte i videnskabsgruppen efter en
>algoritme. Jeg fik et par muligheder, og én af dem kunne jeg lave i en
>SQL-query:
>
>SELECT id FROM tabel WHERE RAND()*12<weight ORDER BY RAND() LIMIT 1
>
>Jeg har her defineret vægt-skalaen til at gå fra 0-12. (hvor 0 er "skal
>slet ikke udvælges").
>
>Der er en teoretisk risiko for, at der ikke kommer nogen resultater, så
>lige den ene ting må jeg tage hensyn til i programmet.

Prøv bare

SELECT id FROM tabel ORDER BY RAND()/weight ASC LIMIT 1


--
Nis Jorgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Niels Andersen (15-07-2002)
Kommentar
Fra : Niels Andersen


Dato : 15-07-02 15:23

Nis Jorgensen wrote in <hjg5ju4t6o1smqbligu5v6p2oun8gq1ne5@4ax.com>:
>>SELECT id FROM tabel WHERE RAND()*12<weight ORDER BY RAND() LIMIT 1
> SELECT id FROM tabel ORDER BY RAND()/weight ASC LIMIT 1

Søreme jo, det giver samme fordeling (jeg kørte statistik på 10.000
udtrækninger).
Med fordelen at der altid kommer noget retur, at jeg ikke behøver at kende
max, og at det ikke giver problemer hvis vægt-gennemsnitter kommer langt
under MAX(weight)/2. :)

Jeg måtte dog lige tilføje: WHERE weight>0. :)
Nok en fjollet måde at "disable" en række, men ved automatisk
vægt-beregning kunne det ligefrem blive nødvendigt. :)

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste