Autor Zpráva
JardaB
Profil
Nejsem dobrý matematik, nenapadá někoho, jak napsat funkci, která bude vracet čísla od 1 - x. S tím, že vyšší čísla budou padat s mnohem menší pravděpodobností než nižší? Ještě bych do té funkce chtěl zakomponovat nějaký parametr obtížnost, který bude ovlivňovat míru pravděpodobnosti, tzn. který ovlivní, že vyšší čísla budou padat ještě méně, či více.

Mě napadlo jen to, že bych udělal rekurzi a vygeneroval určitý počet náhodných čísel a výsledek bral jako jejich průměr, nebo jejich nejnižší hodnotu. Přičemž obtížnost by byla četností samotné rekurze. Věřím, že to lze napsat mnohem elegantněji. To co jsem navíc napsal, bude při zprůměrování asi spíš vracet více čísla kolem středu a okolo méně, což není zcela to, co chci.
M4n
Profil *
Pro generování náhodných čísel s vlastním rozložením pravděpodobnosti se většinou používá metoda Monte Carlo. Zkus vygooglit, pravděpodobně najdeš hotovou implementaci pro jakýkoliv jazyk.
juriad
Profil
O jakém jazyku se bavíme? Pokud tvůj popis neuniformní distribuce pravděpodobnosti odpovídá některé známé distribuci, použij knihovnu, která ji již má implementovanou.
Seznam distribucí a jejich popisů a použití najdeš třeba na en.wikipedia.org/wiki/List_of_probability_distributions

M4n:
Často je lepší provést vhodnou matematickou transformaci z uniformního rozdělení.
JardaB
Profil
M4n:
Díky, na to určitě mrknu, hodilo by se to v PHP

juriad:
tohle je na mě už vyšší level bohužel...
TomášK
Profil
Monte Carlo mi nesedí, ani s přečtením wiki mě nenapadá, jak ho použít. Snad jedině en.wikipedia.org/wiki/Inverse_transform_sampling a říkat tomu Monte Carlo? Nezdá se mi to, ale možná o tom jen nevím dost.

JardaB
Tipuju, že hledáš něco jako:
1 -  stats_rand_gen_exponential()
JardaB
Profil
TomášK:

Je to dost možné, nicméně podrobný popis stats_rand_gen_exponential() jsem nenašel, tedy nemohu posoudit. V manuálu o tom moc není.
Napadlo mě určitě řešení, tak to zkusím napsat a případně sem hodím pro otestování ukázku..
TomášK
Profil
Popis tam je (generates a random deviate from the exponential distribution.), což volně přeloženo říká, že to vygeneruje náhodné číslo podle exponenciálního rozdělení. Podrobný popis exponenciálního rozdělení najdeš na wiki případně to zadej do googlu. Pro představu, jaká čísla to generuje, je dobrý graf hustoty (první na wiki). Nebude-li ti vyhovovat, můžeš projít další náhodná rozdělení, která v té knihovně jsou.
Bubák
Profil
Napadly mě tři primitivní možnosti.
- Vygenerovat několik čísel a vybrat to nejnižší.
- Vygenerovat náhodné číslo v intervalu 0 až 1, umocnit ho exponentem větším než 1. Pak vynásobit číslem x, připočíst jedničku. Pokud má být číslo celočíselné, tak ještě prohnat přes integer.
- Vygenerovat několik náhodných čísel v intervalu 0 až jedna, vynásobit je navzájem....

Moje znalosti nejsou takové, abych poznal, jaké bude rozložení takto vygenerovaných náhodných čísel.
M4n
Profil *
TomášK:
Monte Carlo mi nesedí, ani s přečtením wiki mě nenapadá, jak ho použít.
Rozsypeš hrách na zem a budeš počítat jen to co je pod tvým požadovaným rozložením (grafem) pravděpodobnosti. To je v kostce definice metody Monte Carlo. Dají se tak docela přesně počítat i integrály (když sečteš ty hrachy ze země).
_es
Profil
M4n:
Pro generování náhodných čísel s vlastním rozložením pravděpodobnosti se většinou používá metoda Monte Carlo.
To dosť pochybujem a ešte k tomu vraj „väčšinou“. Ako napríklad také nejaké konkrétne „použitie“ vyzerá? Metóda Monte Carlo je určená na využitie veľa už vygenerovaných náhodných čísel na približný výpočet niečoho, čo je problém vypočítať presne. Snáď sa to dá nejako využiť aj na toto, no bolo by to s efektivitou ako keby sa vyrábali špáradlá obrúsením pňa do tvaru špáradla.

JardaB:
Ještě bych do té funkce chtěl zakomponovat nějaký parametr obtížnost...
Použi druhý postup v [#8] Bubák a meň „exponent“.
Bez presného matematického popisu, čo si predstavuješ pod „vyšší čísla budou padat s mnohem menší pravděpodobností než nižší“ je ťažké konkrétnejšie poradiť.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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