Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: ntz_reloaded 11 Dubna 2012, 21:41:39

Název: vysetrovani prubehu funkce [patrne]
Přispěvatel: ntz_reloaded 11 Dubna 2012, 21:41:39
ahoj,

tupe jelitko co nezna stredoskolskou matiku prosi o pomoc .. napsal jsem tento obludny priklad v perlu:

Kód: [Vybrat]
#!/usr/bin/perl

use strict;
use warnings;

my $xloops=100;
my $yloops=100;
my $rrrand=0xFFF;
my @levels=(0,10,20,45,65);
my %results;

### the x
foreach(1..100) {
        my @hpool;

        #### the y, result is an array with average values in 100 rounds
        foreach(1..$xloops) {
                my $bcth;
                $bcth += rand($rrrand) foreach(1..$yloops);
                push @hpool, $bcth/$yloops;
        };

        #### the z, we take only overwatched levels before dropping the rest at the beginning
        @hpool = sort { $b <=> $a }  @hpool;
        push @{ $results{$_} }, $hpool[$_] foreach(@levels);
};

foreach(@levels) {
        print "RPERF: ", 100-$_, ": ", join "; ", sort { $b <=> $a } @{ $results{$_} }[0,4,19,49,-20,-5,-1];
        print "\n";
};

potrebuju udelat to co pracovne nazyvam `leveling linear randomization' ..

^^ v tehle obludnosti vyse vlastne obhlizim takto nesikovne limity funkce .. vytvarim 2D mapu:

Kód: [Vybrat]
100x loopuj
....vycisti/vytvor @nase_pole;
..........ve 100 dalsich loopech vytvor aritmetickej prumer z rand(foo) a strc hodnotu do @naseho_pole ### tady to je jeden randomization cycle, kde mame 2D mapu pro levely
....setridime nase_pole od nejvetsiho do nejmensiho
....vtbereme jen sledovane levely (poradi v poli) a strcime je hashe co ma ty levely jako keys k arrays, kam strkame nasich 100 loopu, vse jen kvuli sledovani limitu

jen tisk aby bylo na ukazku videt, co to obsahuje

jsem presvedcenej, ze se to da zapsat jako kompaktni matematickej vyraz, kde vysetrujeme vlastne prubeh funkce mezi dvema limity ... teoreticky je mozne dosahnout 0..0xFFF, ale prave proto mluvim o tech limitech.

diky, ntz
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: ntz_reloaded 13 Dubna 2012, 17:48:55
proc me nikdo neporadi o.O .. neslo by tomu alespon matematicky nejak odlehcit ? at to tak neutilizuje ten rand().

diky
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: Martin Šácha 13 Dubna 2012, 19:13:31
Není mi moc jasné čeho vlastně chceš dosáhnout... chceš zjistit monotonii fce na intervalu <a,b>?
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: ntz_reloaded 13 Dubna 2012, 20:24:18
Není mi moc jasné čeho vlastně chceš dosáhnout... chceš zjistit monotonii fce na intervalu <a,b>?
vubec nerozumim otazce ale pripoustim ze mozna chci :D

Kód: [Vybrat]
        my @hpool; #### zacatek, prazdna array

        foreach(1..$xloops) { #### ve 100 prubezich do ni postupme narveme 100x aritmetickej prumer ....
                my $bcth;
                $bcth += rand($rrrand) foreach(1..$yloops); #### ... ze 100x rand(cislo). pozor, zde jinej zapis dalsiho for() { neco }
                push @hpool, $bcth/$yloops;
        };

        @hpool = sort { $b <=> $a }  @hpool; ## tady uz to jen sesortujeme ..

tahle moje funkce aka-rand tedy vraci setridenou array s poctem $xloops prvku, kde kazdy je aritmetickej prumer z $yloops opakovani rand($rrand).

potrebuju se naucit vysledovat prubeh tehle funkce pro limit `a > bcth/yloops > b', kdy a i b mame urceny a jsou to mezni hodnoty jake v realu muzou nastat, ackoliv je teoreticky mozne, ze max a|b je yloops*rrrand ..

diky, ntz
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: ntz_reloaded 13 Dubna 2012, 20:29:51
eg nelinearni rand je 1 z X

a linerarni rand je aritmetickej prumer z vice randu ze stejne mnoziny ..

priklad .. pri randu 1..100 ti muze padnout cokoliv, ale pri randu 2(1-100) delis 2..200 dvema, to znamena ze casteji chodi ty stredni hodnoty a ta krivka funkce ze ti padne x Vs y uz je konkavni/konvexni misto rovna ...

eg trefit se v (1..100) do rozsahu 40-60 je 20%, ale pri 2(1..100) uz znamena tenhle rozsah treba 60% ..
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: Martin Šácha 13 Dubna 2012, 22:13:51
Aha, jasny.
Lineární (aritmetický) průměr získáš součtem a vydělením, (x1+...+xn)/n, geometrický průměr získáš násobením a n-tou odmocninou (x1*...*xn)^(1/n).

No čim větší opakování (větší n) ve vnitřním foru, tím rovnější výstup (=menší rozptyl) ve výsledku dostaneš. Tuplem, jestli (zcela spravne s teorii) odstranuješ největší a nejmenší hodnoty...

Výsledné rozložení na 0x000 .. 0xFFF bude s rostoucim n stale vic pripominat normální rozdělení (Gaussovo), takovej ten "říp".

EDIT: Na zjištění, s jakou pravděpodobností se vejdeš do rozsahu <a,b> exitují tabulky, protože je netriviální to spočítat. http://en.wikipedia.org/wiki/Standard_normal_table
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: starenka 14 Dubna 2012, 00:11:39
import numpy.random

#sory, sem si nemoh' pomoct ;)
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: crowack 14 Dubna 2012, 18:24:51
>starenka: Promin, ale taky jsem si nemohl pomoct  ;D


[příloha smazaná administrátorem]
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: ntz_reloaded 14 Dubna 2012, 19:30:59
aha .. a ono se nejak neda vyjardrit ta sance matematicky ?  no ja bych se naprosto idealne potreboval naucit, jak prevest kombinatoriku do reci pocitace. Verim, ze se to da nejak spocitat. (sorry za muj pseudozapis, ale rozumime si):

kdyz chces z 2(1..6) vyjadrit jakou mas sance ze padne 11, tak u jednoho cisla je to jednoduche, spocitas vsechny kombinace a jsou dve (rekneme ze mame red1..6 a blue1..6): r6 b5 / r5 b6

^^ podle me to stejne jde udelat s jakymkoliv rozsahem. Proste to musi jit nejak vyjadrit ... dejme tomu, ze jako limit oriznes zhora i zdola 0.5% (tzn 1%), kde je krivka nejstrmejsi, potreboval bych se naucit spocitat z raw, kolik tam dela treba to +0.5%/-0.5% pro $x(1..$y) ... musi to nejak jit.

diky, ntz
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: ntz_reloaded 14 Dubna 2012, 20:28:56
mozna jsem uplne vedle, ale teoreticky vim, ze pro rand 2(1..10) muzu pocet moznosti spocitat takto:

Kód: [Vybrat]
my $x = 1;
for my $y (1..10) {
    $x *= $y;
};

to je takovej ten klasickej faktorial n! .. eg pro n=10 to je 10(1..9) .. 10*9*8*7*6*5*4*3*2 .. a ja bych se z toho potrebova naucit ty limity, eg kdyz oriznu 1% z kazde strany a jedu od nejmensich resp nekvetsich tak mi tam musi zustat ten stred

diky d
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: Martin Šácha 14 Dubna 2012, 20:34:52
Například chceš zjistit, s jakou šancí se trefíš do intervalu <0.3,0.8>?

Algoritmus:
0) (0.8-0.5)/0.15 = 2.00 (v tabulkach hledas hodnotu pro 2.00)
1) najdeš že N(2.00) = 97.72%
2) (0.3-0.5)/0.15 = -1.33 (v tabulkach hledas hodnotu pro 1.33) - hledas pod pulkou, takze s minusem
2) najdeš že N(-1.33) = 9.18%
3) ty dvě pravděpodobnosti odečteš 97.72 - 9.18 = 88.54%
4) do intervalu <0.3,0.8> se trefíš s 88.54% šancí

Je to to co chceš, nebo do tebe valim uplny blbosti? :)
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: ntz_reloaded 14 Dubna 2012, 20:58:46
asi to je to co chci, ale chci to spocitat a ne z tabulek ... edit, mozna na to za chvilku prijdu ... jeden chlapce na irc mi poradil viz. nize .. musim se tomu pokusit pozorumet, rekl mi tohle pro priklad ..

hazis 2x sestihranou kostkou a soucet tedy muze bejt 2..12 a dostat 6-7 je nasledujici sance:

Kód: [Vybrat]
20:46 < mauke> eval: (6+5)/36
20:46 < perlbot> mauke: 0.305555555555556
20:48 < mauke> ghc -e '[ (x,y) | x <- [1..6], y <- [1..6], x + y `elem` [6,7] ]'
20:48 < mauke> [(1,5),(1,6),(2,4),(2,5),(3,3),(3,4),(4,2),(4,3),(5,1),(5,2),(6,1)]

ja jsem fakt jelito .. to je stredoskolska matika
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: Martin Šácha 14 Dubna 2012, 21:07:20
No jasně, ale takhle se dá počítat jenom nespojitá pravděpodobnost (třeba ty kostky), kde vzorec je (počet příznivých)/(počet všech) možných stavů.

pokud by jsi to chtěl spojitě (výstup z rand()), tak musíš přes Normální rozdělění. Dá se to spočítat bez tabulek, ale to neumím.
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: jAster_BA 14 Dubna 2012, 21:55:55
Dá se to spočítat bez tabulek, ale to neumím.
Tiež som nad tým minule rozmýšlal. ::)
@ntz
Každopádne možno nájdeš odpoveď v tej stredoškolskej matematike. http://ucebnice.krynicky.cz/Matematika/index.html#9_kombinatorika (http://ucebnice.krynicky.cz/Matematika/index.html#9_kombinatorika)
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: ntz_reloaded 14 Dubna 2012, 22:04:47
aha .. on ten priklad s tema 2 ma hodama je zavadejici .. spocitat to pro zadani:

rand=6 // sestistena kostka
loops=4 // pocet hodu
min=4 // a sance ze nam padne soucet mezi 4mi
max=8 // a 8mi

prava strana vzorecku je jasna: rand**loops, ale jak spocitat tu levou mi teda neni jasny ..

diky, ntz
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: ntz_reloaded 14 Dubna 2012, 22:29:02
@sachy .. dekuju mockrat .. asi to nebude tak jednoduchy vyresit .. je to gaussova krivka patrne .. jde to delat bruteforcem a tak maximalne si nejak zoptimalozat ten prubeh .. ale to je stejne silena utilizace kdyz vlezes do cisel jak v mem puvodnim prikladu

asi ty tabulky nejak importovat ... nebo to treba napisu v cecku .. tam by mohly bejt nejake pokrocilejsi matematicke funkce ?

diky ,, ntz
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: Martin Šácha 14 Dubna 2012, 22:36:19
rand=6 // sestistena kostka
loops=4 // pocet hodu
min=4 // a sance ze nam padne soucet mezi 4mi
max=8 // a 8mi

To bude (8+7+6+5+4)/(6^4)=2.31% - (součet od max do min) děleno (počtem stran na počet hodů)

asi ty tabulky nejak importovat ... nebo to treba napisu v cecku .. tam by mohly bejt nejake pokrocilejsi matematicke funkce ?

To spíš matlab, mathematica nebo freesw R http://www.r-project.org/ , v std céčku není nic...
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: ntz_reloaded 14 Dubna 2012, 22:57:52
sachy, ja to proste nechapu .. nemohl bys mi prosim ten vzorecek napsat obecne .. kdyztak n! == faktorial .. takze ten tvuj zapis z tech 4 hodu tak je ho (ne)chapu je:

podivnej_faktorial_max8-min4!/pocet_kombinaci

^^ pokud teda konstanta pocet_kombinaci znamena vzdy rand**loops (eg tvych 6^4 pro 4 hody kostkou) .. jak se pokazdy dopracovat k tomu podivnemu faktorialu mi neni stale jasny

dekuju, ntz

jak by to teda vypadalo pro cisla:

rand=100
loops=100
min=-45% ## od stredni hodnoty - v realu to delam z tehle strany. chci zjistit jakej je rozsah 90% pravdepodobnosti
max=+45% ### dtto

eg z druhe strany:

rand=100
loops=100
min=5050 ### tady by to melo vychazet na 50% presne, neb stredni hodnota je min_limit+max_limit/2
max=10000 ### a co teprve s tou hodnotou udela, kdyz tam zuzis tu range eg. jak ji zkratit rovnomerne .. tzn +/-10% na na konvexni nebo konkavni strane krivky

ps. uplne v realu bych si to asi potreboval zgrafovat protoze musim vystopovat podle tvaru te krivky nejake vhodne flattering_ratio pro nejakou randomizaci .. vlastne flat_divisor=1 znamena full flat kdyz randomizujes eg rand(foo), flat_divisor=2 je kdyz udelas 2x rand a vydelis 2ma, etc ..

v realu potrebuju vystopovat prubeh tech krivek nejakou vizualizaci (to si udelam vsechno sam nejak), ale ja totiz neumim spravne vyjadrit ty vzorecky ze kterych se to sklada

tisicere diky
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: Martin Šácha 14 Dubna 2012, 23:45:04
Tam není faktoriál, ale suma - nic se nenásobí, sčítá se.
Kód: [Vybrat]
min=4
max=8
rand=6
loops=4

citatel=0
for(i=min;i<=max;i++)
  citatel+=i ##proste secte cisla od min do max

jmenovatel=rand**loops ##pocet vsech moznych stavu (kombinaci)

vysledek=citatel/jmenovatel ##jaka je pravdepodobnost ze se trefis mezi min a max
rand=100
loops=100
min=-45% ## od stredni hodnoty - v realu to delam z tehle strany. chci zjistit jakej je rozsah 90% pravdepodobnosti
max=+45% ### dtto
Já vlezu do tabulek, zjistím, že:
-45%=5% = -1.65
+45%=95% = 1.64
(-1.65 * 0.15)+0.5=0.2525 ##min, proc jsem vysvetlil nahore
(1.64 * 0.15)+0.5=0.746 ##max

Řešení: na 90% se třefíš do intervalu <0.2525, 0.746>.

EDIT: 0.15 a 0.5 jsou konstanty, toho si nevsimej
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: ntz_reloaded 14 Dubna 2012, 23:51:20
To bude (8+7+6+5+4)/(6^4)=2.31% - (součet od max do min) děleno (počtem stran na počet hodů)

tohle je podle me spatne stejne jako dalsi vypocty ... dle selskeho rozumu mi tam chybi 1, eg

pri 4 hodech 6tistranou kostkou (max kombinaci 6**4) muzes:

4) hodit jen jednou kombinaci
5) hodit 4 kombinacema (0001,0010,0100,1000) etc ..
6) 2000,0200,0020,0002,1100,1010,1001,0110,0101,0011 ? 10ti kombinacema, etc
7) (4+6+6+4) 3000,0300,0030,0003, + *1.5-permutace2-1*2 + 4x 0111,1011,1101,1110

^^ tady jsem uz mozna neco zapomel

3000,0300,0030,0003
0111,1011,1101,1110
2100,2010,2001,0201,0021,0210
1200,1020,1002,0102,0012,0120


takze by to melo spis zacinat 1+4+10+20+? == presne 5 clenu pro rozsah 4-8

ntz
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: Martin Šácha 14 Dubna 2012, 23:59:22
To bude (8+7+6+5+4)/(6^4)=2.31% - (součet od max do min) děleno (počtem stran na počet hodů)

tohle je podle me spatne stejne jako dalsi vypocty ... dle selskeho rozumu mi tam chybi 1, eg

pri 4 hodech 6tistranou kostkou (max kombinaci 6**4) muzes:

4) hodit jen jednou kombinaci
5) hodit 4 kombinacema (0001,0010,0100,1000) etc ..

takze by to melo spis zacinat 1+4+?+?+? == presne 5 clenu pro rozsah 4-8

ntz
To není součet možností "jak se dostat k číslu" ale součet čísel pro které chceš znát pravděpodobnost, že se k nim dostaneš.
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: Martin Šácha 15 Dubna 2012, 00:23:27
Ntz, při vší úctě, vymejšlíš kraviny.
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: ntz_reloaded 15 Dubna 2012, 00:24:06
dyk procento ziskas jako pocet kombinaci / pocet moznosti .. tzn pro 8:

Kód: (35) [Vybrat]
0004 .... 4
1111 .... 1
0022 .... 6
0013 .... 6 0013,0130,1300,1030,1003,0103
0031 .... 6
0211 .... 4 0211,2011,2101,2110
0121 .... 4 0121,1021,1201,1210
0112 .... 4 0112,1012,1102,1120

takze (1+4+10+20+35)/6**4

takze nejmensi sance mi vychazi na 5,4%, sorry ;) - a to jsem spis jeste neco mozna zapomel

Kód: [Vybrat]
3> perl -E 'say eval (1+4+10+20+35)/6**4'
0.0540123456790123

hadat se nebudu ale prosim, aby ses zamyslel nad tim co jsem napsal .. mozna se nechapeme, ale tys to zadani vyresil takto

To bude (8+7+6+5+4)/(6^4)=2.31% - (součet od max do min) děleno (počtem stran na počet hodů)

^^ a me to dle selskeho rozumu vychazi uplne jinak - ja to nezpochybnuju, kazdej dela chyby, ja vim prdlajz
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: ntz_reloaded 15 Dubna 2012, 00:35:31
podle me potrebujes umet pocitat ten inkrement po tech levelech eg 1-4-5-10-20-35..limit .. a to bude nejaka osliva funkce
Název: Re:vysetrovani prubehu funkce [patrne]
Přispěvatel: ntz_reloaded 15 Dubna 2012, 00:56:01
http://mathworld.wolfram.com/Dice.html