-
1. Data: 2009-01-16 13:05:30
Temat: Algorytm losowania obiektow posiadajacych rozna "waznosc"?
Od: WRonX <w...@-...net>
Witam grupe.
Potrzebuje wylosowac z bazy banner do wyswietlenia. Bannery maja miec
jednak rozna waznosc, tj. rozne prawdopodobienstwo, ze zostana
wylosowane. Jak to najlepiej zrobic?
Jak dotad poslugiwalem sie prostym algorytmem, ktory mozna zobrazowac
jako os wspolrzednych, na ktorej bannery sa odcinkami, polozonymi jeden
za drugim, a ich dlugosc ma byc prawdopodobienstwem ich wylosowania. I
po pobraniu dlugosci sumy odcinkow (tj. wartosci "konca" ostatniego
bannera), losuje liczbe od zera do "konca" i sprawdzam, w ktory odcinek
(banner) "trafilem".
Niestety, okazalo sie to bardzo powolne (wykazaly to logi bazy). Czy
jest jakis szybki i prosty algorytm pozwalajacy to zrealizowac?
Podpowiem, ze bannery siedza w basie MySQL, a kod bedzie w PHP, chociaz
nie wiem, czy to ma znaczenie.
Pozdrawiam.
--
[= WRonX =] [= W...@-...NET =] [= http://WRonX.NET =]
[ "...yet the blood of the wicked shall flow like a river." ]
[ GCC d- s+:- a-- C++ US P+ L+ !E W+++ N+++ w++ !O M-- !V ]
[ PS Y- t-- X+++ R+++ tv- !PGP b++ DI++ D+ G+ e h! r++ y? ]
-
2. Data: 2009-01-16 15:21:02
Temat: Re: Algorytm losowania obiektow posiadajacych rozna "waznosc"?
Od: Mikolaj Rydzewski <m...@c...pl>
WRonX wrote:
> Niestety, okazalo sie to bardzo powolne (wykazaly to logi bazy).
Jak to: powolne?
Jak zaimplementowales ten algorytm?
Tablica int'ow wypelniona ID bannerow (aby uzyskac owa 'os'). Potem
zwykle random() i wyciagasz banner po jego ID z bazy.
Taka tablice aktualizujesz po zmiane w bannerach badz ich wagach.
-
3. Data: 2009-01-16 20:00:11
Temat: Re: Algorytm losowania obiektow posiadajacych rozna "waznosc"?
Od: "Artur Halaczkiewicz" <a...@g...com>
> Tablica int'ow wypelniona ID bannerow (aby uzyskac owa 'os'). Potem zwykle
> random() i wyciagasz banner po jego ID z bazy.
aha :)
przy zalozeniu ze wagi sa procentami i sumuja sie do 100
a waga_banera[] to tablica z wagami banerow, liczba_banerow to liczba
banerow :)
to w takim pseudo C powinno wygladac mniej wiecej tak:
[code]
int t[100];
int id=0;
for (int id_banera=0;id_banera<liczba_banerow;id_banera++)
for (int b=0;b<waga_banera[nr_banera];b++)
t[id++]=id_banera;
[/code]
(tylko nie testowalem - napisalem z glowy w mailu :) )
i teraz tylko jak chcesz to wywolujesz:
[code]
id_banera_do_wyswietlenia=t[rand()%100];
[/code]
imo - szybciej i prosciej sie nie da
oczywiscie wszystko wali w leb jezeli zalezy ci na dokladniejszych wagach
niz 1% oraz gdy banerow jest wiecej niz 100
ale wowczas wystarczy tylko zwiekszyc tablice t i chula :)
--
arturh
+----------------------------------+
| www.txt2dots.com |
| To create inscription or logo |
| using small elements like |
| coins, LEDs, matches etc. |
+----------------------------------+