Autor Zpráva
sexusbtw
Profil
Zdravím..
Potřeboval bych v php sestavit skript, který ze sekvence náhodných čísel (např. 1-5) vybíral náhodné číslo. Něco jako mt_rand(). Jenomže potřebuji, aby jedno, případně více čísel mělo jakousi prioritu a zobrazovalo se častěji - takže by to dojem náhodného zobrazování spíše navozovalo...
Asi bude dobře, když popíšu konkrétní věc:
Mám na FTP složku s Flash bannery, které se náhodně zobrazují. Není problém projít direktorář a načíst názvy souborů do pole. Pak se dá krásně vybrat náhodné číslo pole. Jenže by z marketingového hlediska bylo dobře, kdyby se některé lukrativní bannery zobrazovaly častěji. Představoval jsem to tak, že by se bannerům dávala procentuální priorita, ale nevím jak...
Díky..
srigi
Profil
sexusbtw
Nacitaj nazvy bannerov do pola, bannery s vyssou prioritou pridaj do pola viackrat. Napr. budes mat prioritu 1 az 50, baner s prioritou 50 nacitaj do pola 50x a podobne. Nakoniec pole premiesaj -> array_shuffle() a vyber vzdy prvu polozku pola -> array_shift().
Alphard
Profil
Nakoniec pole premiesaj -> array_shuffle()
a kdyby taková funkce existovala, bylo by to úplně supr :-) shuffle()
sexusbtw
Profil
srigi - vidíš to mě vůbec nenapadlo.. Děkuji ti!
array_shift neznám, ale napadla me takovato kontrukce:

$bannery = array(); // zde bude pole, kde budou prioritni bannery vicekrat
$shuffle($bannery); // zamichame
$cislo_nahodneho_banneru = rand(0, sizeof($bannery)); //vybereme nahodne cislo pole, bannery co jsou vicekrat maji logicky vyšší šanci
$nahodny_baner_s_prioritou = $bannery[$cislo_nahodneho_banneru]; //dostavame "nahodne cislo"
sexusbtw
Profil
shuffle($bannery); // zamichame - ta promenna tam samozrejme nemela co delat..
Alphard
Profil
nemá smysl míchat pole a pak ještě vybírat náhodný klíč
stejně tak bych se vykašlal na array_shift

$bannery = array(); // zde bude pole, kde budou prioritni bannery vicekrat 
shuffle($bannery); // zamichame 
$bannery[0];  // zpracujte, jak chcete
sexusbtw
Profil
Alphard: to máš pravdu, když už je to zamíchané, není třeba "znovu vybírat náhodně", stačí první klíč...
srigi
Profil
sexusbtw
"Dvojitou nahodou" by si poskodil ideu mojho navrhu. Ked zamiesas pole, musis vyberat vzdy ten isty prvok. Naopak, mozes mat pole uporiadane a vyberas nahodny prvok. Ale nikdy obe metody naraz!
Timy
Profil
Já bych spíš vybíral náhodný index, protože to bude řádově jednodušší než míchat pole.
AM_
Profil
S tím mícháním pole by to mělo smysl, kdyby se to pořadí třeba někam uložilo a pak bannery "rotovaly" a tím by se 100% zaručilo, že se postupně zobrazí všechny. Ale zákon pravděpodobnosti garantuje téměř stejný výsledek za cenu mnohem méně strojového času vybráním náhodného prvku, taky bych to nemíchal.
sexusbtw
Profil
takže navrhujte tohle?

$bannery = array(); // zde bude pole, kde budou prioritni bannery vicekrat
$cislo_nahodneho_banneru = rand(0, sizeof($bannery)); //vybereme nahodne cislo pole, bannery co jsou vicekrat maji logicky vyšší šanci
$bannery[$cislo_nahodneho_banneru]; // vystup
Timy
Profil
sexusbtw
int rand ( int $min , int $max )

$cislo_nahodneho_banneru = rand(0, sizeof($bannery) - 1);


Jinak by to mohlo vygenerovat index rovný počtu prvků v poli, což je ale o jedno políčko za koncem pole :-).
sexusbtw
Profil
Timy: jasně toho jsem byl vědom - klice v poli zacinaji nulou, jen jsem to v rychlosti prehledl

Děkuji všem za konstruktivní rady, jste lidi na pravém místě.
Ještě jednou díky...
necesp
Profil *
Dobrej kod.

A kdybych chtěl k tomu obrázku připsat nějaký text???

Takto

obr1 = text1
obr2 = text2
obr3 = text3

atd

Děkuji za radu.

Petr
_es
Profil
Nechce sa mi rozmýšľať nad kódom, navrhnem to len matematicky,
tak aby sa pravdepodobnosť každého bannera dala nastaviť ľubovoľne:
* Zvolí sa rozlíšenie - napríklad 1000 hodnôt.
* Každému banneru sa pridelia 2 čísla - rozsah v intervale 1 až 1000,
tak, aby sa rozsahy jednotlivých bannerov neprekrývali
a bol pokrytý celý interval 1000 hodnôt.
* Po vygenerovaní náhodného celého čísla medzi 1 a 1000 sa zistí,
do akého rozsahu to číslo patrí, teda aký banner sa má zobraziť.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: