Potrebujem vygenerovat nahodne cislo s urcitou prioritou. Normalne by som robil nahodne cislo cez $cislo = rand(0,10); ale potrebujem, aby sa dalo nastavit, ze napr. cislo 7 sa bude zobrazovat raz tak viac nez ostatne cisla. Napriklad hodnota premennej $cislo bude po 20 pokusoch takato:
9|7|5|3|7|1|8|2|7|6|0|7|7|1|4|5|9|7|4|7|0
ako ste si vsimli, priorita je dana na cislo 7, lebo sa zobrazuje najviac krat. Ale potrebujem aby sa dala ta priorita nastavovat v % (100% = zobrazovala by sa stale 7, 0% = 7 by sa vobec nezobrazovala, 50% = bez priority) a bolo by dobre, keby sa ta priorita dala nastavit aj na viac cisel. Napr. rand(0,100); a priorita 45% by bola na cislo 18, priorita 72% by bola na cislo 51 a priorita 17% na cislo 8. Dalo by sa to nejako? Dakujem za kazdu odpoved. Pomohlo by mi aj riesenie ako vyselektovat z mysql nejake riadky podla urcitej priority. Este raz diki za odpovede ;-)
Tak to nahazej do pole a pomoci randu to z pole vytahnes....Kdyz tam bude 7ka X krat vice nez ostatni... Nejtezsi bude napsat fci pro praci s tim polem
funce jpro náhodný výběr z pole je v PHP: array_rand()
Ale musi nejak osetrit, ze kdyz zada v procentech napr 40%, ze se zvysi pocet ostatnich, aby byl nove zadany obsazeny v poli jenom jednou... Samotne vybrani z pole nebude tezke :) Coz ale nebude taky az tak tezke..
Docela zajímavý problém. Zkusím něco vymyslet. Ale nebude to hned.
Obecně máš generátor s rovnoměrným rozložením a s tím můžeš dělat ptákoviny.
Pokud máš známý počet hodnot a procenta se nenastavují v příliš jemných krocích, dá se to skutečně nacpat do pole (1,2,3,4,5,6,6,7,7,7), podle procent, ale je to řešení, které asi neuspokojí všechno. Nic méně zatím nejrychlejší z toho, co mě napadá.
Dál mě napadlo, pokud bys napasoval čísla na vhodné rozložení (normální, exponenciální), tak aby vyhovovaly pravděpodobnosti, tak bys taky dostal výsledek.
K čemu by se měly priority používat? Třeba bude zajímavá úvaha tímto směrem.
Zkusím prolízt net...
hmm.... tak ako? vymysleli ste nejake riesenie?
No, tak sa mi to nejako podarilo spravit aj s mensou pomocou soomu. Vyzera to asi takto:
<?
function prand($od,$do,$cislo,$percento) {
$pole = array();
$zamenene = array();
for ($i=$od;$i<$do+1;$i++) {
$pole[] = $i;
if ($i == $cislo) {$zamenene = 1;}
else {$zamenene = 0;}
}
$pole = array(4,5,6,7,8,9);
$zamenene = array(0,0,0,1,0,0);
$zamenit = round(($percento/100)*count($pole))-1;
for ($i=0;$i<$zamenit;$i++) {
$pokracovat = 1;
while ($pokracovat == 1) {
$rand = rand(0,count($pole)-1);
if ($zamenene[$rand] == 0) {
$zamenene[$rand] = 1;
$pole[$rand] = $cislo;
$pokracovat = 0;
}
}
}
echo $pole[rand(0,count($pole)-1)];
}
// pouzitie prand(int cislo_od, int cislo_do, int cislo, int percento_zobrazenia);
echo prand(0,9,7,50);
?>
Problem je vsak v tom, ze tato fce dokaze spracovat len jedno cislo. Nenapada ma ziaden sposob, ako by sa tam dalo zapracovat ovladanie viac cisel napr. ze by vstupne hodnoty boli v poli napr. prand(0,9,array(7=>50,4=>70,9=>20)) - cislo 7 by malo prioritu 50%, 4 70% a cislo 9 20%. Vdaka za odpoved.
sorry, ta fce ma byt takto:
<?
function prand($od,$do,$cislo,$percento) {
$pole = array();
$zamenene = array();
for ($i=$od;$i<$do+1;$i++) {
$pole[] = $i;
if ($i == $cislo) {$zamenene = 1;}
else {$zamenene = 0;}
}
$zamenit = round(($percento/100)*count($pole))-1;
for ($i=0;$i<$zamenit;$i++) {
$pokracovat = 1;
while ($pokracovat == 1) {
$rand = rand(0,count($pole)-1);
if ($zamenene[$rand] == 0) {
$zamenene[$rand] = 1;
$pole[$rand] = $cislo;
$pokracovat = 0;
}
}
}
echo $pole[rand(0,count($pole)-1)];
}
// pouzitie prand(int cislo_od, int cislo_do, int cislo, int percento_zobrazenia);
echo prand(5,9,7,50);
?>
<HTML><pre style="line-height: 0.5em;">
<b>function</b> prand($min, $max, $procento) {
$end_array = <b>array</b>();
$increment = 0;
<b>foreach</b> ($procento <b>as</b> $key=>$value)
$procento[$key] = round((($max-$min)/100)*$value);
<b>for</b> ($a = $min; $a < $max; $a++) {
<b>foreach</b> ($procento <b>as</b> $key=>$value)
<b>if</b> ($key == $a) {
<b>for</b> ($b = 0; $b < $value; $b++)
$end_array[$increment++] = $a;
}
<b>else</b>
$end_array[$increment++] = $a;
}
shuffle($end_array);
<b>return</b> $end_array[rand(0, count($end_array)-1)];
}
</pre>
pouziti:
echo prand(0, 10, array(4=>50, 7=>70, 5=>10)); atd...
ale pozor, funkce funguje na principu sance (Tom ;) takze cisla nevytlacuji svym pozadovanym vyskytem ostatni pouze je % prevysuji</HTML>