Náhodné číslo s prioritou
9 příspěvků
Archiv diskusního fóra
Fórum je uzavřené a slouží pouze ke čtení. Některé informace mohou být zastaralé.
-
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>