|
| 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.)
| |
|
|