Jump to content
php.lv forumi

kā lai uztaisa PHP scriptu kas random kārtībā izvēlas ads ar dažādām p


1mher3

Recommended Posts

lieta tāda ka lapā ir tik viena top reklāmas vieta, bet daudzas reklāmas.

Es gribu uztaisīt ka top vietā jauktā kārtiibā tiek demonstrētas visas reklāmas... ja visas reklāmas būtu vienādi svarīgas, zinātu ko darīt,

 

bet man tām reklāmām ir dažāda savarīguma pakāpe... es gribu uztaisīt tā ka, reklāmām, tās ievadot, tiek norādīta dažāda svarīguma pakāpe (piem., no 1 līdz 10) un lapā reklāmas ar augstāku prioritāti tiek proporcionāli rādītas biežāk.

 

Varbūt ir zināms kāds vienkāršs veids/kods tāda veida random funkcijas realizēšanai?

Link to comment
Share on other sites

Varbūt ir zināms kāds vienkāršs veids/kods tāda veida random funkcijas realizēšanai?

Skjiet kaa parak vienkarsha veida nav , bet teiksim liidz 10 skaitljiem var megjinat sadi

function prop_func()
{
 $keychars = "555555444443333222110";
 $randkey = "";
 $max=strlen($keychars)-1;
 $randkey .= substr($keychars, rand(0, $max), 1);
return $randkey;
}

sanak ka varbutiba ka izkritis kads no skaitljiem (simboliem) ir proporcionala to skaitam stringaaa iznak taada ka 'piramiida'

 

555555

44444

3333

222

11

0

Link to comment
Share on other sites

Būtībā ir tā, ka lai tev piedāvātu kaut kādu tev reāli derīgu risinājumu ir vairāk jāzina par to, kā tu tās reklāmas tirgo un ko tavuprāt nozīmē prioritāte.

 

Tb ir starpība vai tev prioritāte nozīmē, ka konkrēta reklāma ar augstāku prioritāti tiek rādīta līdz viņai beidzas ekspozīcijas un tikai tad rotācijā parādās citas vai arī tu gribi, lai reklāmas ekspozīcijas tiek tērētas pakāpeniski, vienkārši piešķirot lielāku parādīšanās varbūtību konkrētai reklāmai. Tāpat ir no svara, cik precīzas atskaites par reklāmu parādīšanas statistiku tu gribi redzēt, vai tev reklāmas tiek tirgotas dienas ietvaros vai ekspozīciju skaitā, vai jaunas reklāmas var parādīties dienas vidū, utt., utjpr.

 

Vienkāršākais variants, ja gribi lai viena reklāma rādās 1 reizi, otra 3 reizes, bet trešā 6 reizes no 10 ekspozīcijām ir vienkārši veidot kaut vai php masīvu

 

$ads = array(
1,2,2,2,3,3,3,3,3,3
)

 

un pēc tam ar triviālu rand() izvēlies vienu no 10 masīva elementiem, kuras reklāmas ID tev rādīt:

 

$adId = $ads[rand(0,9)];

 

Ja tu darbojies ar ekspozīcijām, tad vari veidot, piemēram, variantu, ka tu skaiti visu reklāmu parādītās ekspozīcijas konkrētā laika posmā un izvēlies to, kura šajā laika posmā ir procentuāli saņēmusi vismazāk ekspozīciju. Piemēram, tev ir mysql tabula:

 

ad_id, ad_exp_last_hr, ad_priority
1, 0, 1
2, 0, 3
3, 0, 6

 

un

select ad_id from ads order by ad_exp_last_hr / ad_priority ASC limit 1

 

+ parādītās reklāmas atbilstošajam ad_id jāpalielina ekspozīciju skaits laika periodā:

 

update ads set ad_exp_last_hr = ad_exp_last_hr + 1 where ad_id=x

 

tādējādi vienmēr tiks izvēlēta reklāma, kurai pēdējās stundas laikā saņemto ekspozīciju skaits dalīts ar prioritāti būs vismazākais:

 

1. ekspozīcija

1, 0, 1
2, 0, 3
3, 0, 6

 

izvēlas to pašu 1

 

2. ekspozīcija

1, 1, 1
2, 0, 3
3, 0, 6

 

izvēlas 2

 

3. ekspozīcija

1, 1, 1
2, 1, 3
3, 0, 6

izvēlas 3

 

4. ekspozīcija

1, 1, 1
2, 1, 3
3, 1, 6

 

atkal izvēlas 3, jo 1/3 ir lielāka par 1/6

 

utt.

 

Protams, tas viss atkarīgs no slodzes un citām prasībām ;)

Link to comment
Share on other sites

Riktīgi dīvainus risinājumus iesakat (duplicēt skaitli tik reizes cik svarīga reklāma...) Kas būs, ja svars nav vesels skaitlis? tūkstots reizes masīvā liksiet reklāmas identifikatoru?

 

Vienkāršāk un efektīvāk ir salikt svarīguma koeficientus masīvā:

$arr = array(10, 5.8, 6, 8); // 0'ai reklāmai svars 10, 1'ai reklāmai svars 5.8, 2'ai reklāmai svars 6, ... utt

Tad izveido otru masīvu:

$arr2 = array($arr[0]);
for ($i=1; $i<count($arr); $i++)
{
 $arr2[] = $arr2[$i-1] + $arr[$i];
}

Tagad izvēlas vienu random skaitli no 0 līdz pēdējam $arr2 elementa vērtībai:

$r = rand(0, $arr2[count($arr2)-1]);

Tagad ar bināro meklēšanu atrod elementu, kurš atbilst izvēlētajai vērtībai (zemāko robežu):

$low = 0;
$high = count($arr2)-1;
while (true)
{
 $mid = ($low + $high) / 2;
 if ($arr2[$mid] > $r) 
 {
$high = $mid - 1;
 }
 else if ($arr2[$mid] < $r)
 {
$low = $mid + 1;
 }
 else
 {
$result = $mid;
break;
 }
}

Galā šis $result saturēs indeksu, kurš elements ticis izvēlēts - 0,1,2,...,N-1.

Link to comment
Share on other sites

Glabājam katrai reklāmai divus parametrus:

A un B

0.1 0

0.2 0

0.3 0

 

izvēlamies to reklāmu rādīt, kurai B ir vismazākais un palielinām B par A

Izvēlamies 1.

0.1 0.1

0.2 0

0.3 0

 

izvēlamies 2.

0.1 0.1

0.2 0.2

0.3 0

 

izvēlamies 3.

0.1 0.1

0.2 0.2

0.3 0.3

 

izvēlamies 1.

0.1 0.2

0.2 0.2

0.3 0.3

 

izvēlamies 1.

0.1 0.3

0.2 0.2

0.3 0.3

 

izvēlamies 2.

0.1 0.3

0.2 0.4

0.3 0.3

 

izvēlamies 1.

0.1 0.4

0.2 0.4

0.3 0.3

 

izvēlamies 3.

0.1 0.4

0.2 0.4

0.3 0.6

Link to comment
Share on other sites

centīšos izskaidrot precīzāk...

nu tur tā, reklāmas derīgums beidzas pēc noteikta rādījumu skaita.

 

prioritāte vajadzīga priekšs tā, lai reklāmas sadalītu par kategorijām - lai sanāktu ka jo vairāk rādījumi konkrētai reklāmai pievienoti, jo biežāk tā tiek rādīta.

piem,

prioritāte 1 - reklāmām ar 1000 credits

...

prioritāte 10 - reklāmām ar 10000 credits

 

ar laiku datu bāzē salasīsies daudz ieraksti, vairākas reklāmas būs ar vienādu prioritāti, pa starpai būs neaktīvas reklāmas...

 

ilgi domāju līdz izfunktierēju ka vajadzētu funkciju kura sasummē visu aktīvo reklāmu prioritātes, tad no tā skaitļa random kārtībā izvēlas vienu vērtību, tad vēlreiz iet cauri datu bāzei summējot ierkastu prioritāšu vērtības līdz atduras robežai kurā ir izvēlētā random vērtība...

vienīgais veids kā es ar savām zināšanām varētu uzķīmiķot tādu funkciju, ir izmantojot "IF" un "WHILE"...

 

to bubu,

paldies.

hmm... nevaru tā precīzi iebraukt vai tas kods darīs to ko vajag...

Link to comment
Share on other sites

Ja tev būs daudz reklāmas, tad ieteiktu nemainīt dinamiski prioritāti atkarībā no atlikušo kredītu skaita, jo var izveidoties situācija, ka tev būs milzīgs skaits ar reklāmām, kurām būs niecīgs ekspozīciju atlikums un attiecīgi niecīga parādīšanās varbūtība. Savukārt no jauna pievienotās reklāmas rādīsies praktiski visu laiku. Tādējādi tev ar laiku vienkārši veidosies milzīgs "nepabeigto" reklāmas kampaņu apjoms, kas tikai traucēs.

Link to comment
Share on other sites

Ja tev būs daudz reklāmas, tad ieteiktu nemainīt dinamiski prioritāti atkarībā no atlikušo kredītu skaita, jo var izveidoties situācija, ka tev būs milzīgs skaits ar reklāmām, kurām būs niecīgs ekspozīciju atlikums un attiecīgi niecīga parādīšanās varbūtība. Savukārt no jauna pievienotās reklāmas rādīsies praktiski visu laiku. Tādējādi tev ar laiku vienkārši veidosies milzīgs "nepabeigto" reklāmas kampaņu apjoms, kas tikai traucēs.

man jau ideja ir uzlikt prioritātes atkarībā no sākotnējā (nevis atlikušā) kredītu apjoma.

Edited by 1mher3
Link to comment
Share on other sites

Nu man ir sistēma tāda, pavisam vienkārši, paņem kādu random image javascript failu, vienkārši tad ja tev būtu piem divi banneri. Vienu banneri kodā ievieto vienu reizi, bet otru divas reizes, tātad rādījumi pirmam bannerim būs vairāk, nekā otram. Ātri un vienkārši

Link to comment
Share on other sites

×
×
  • Create New...