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
-
ahoj,
tupe jelitko co nezna stredoskolskou matiku prosi o pomoc .. napsal jsem tento obludny priklad v perlu:
#!/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:
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
-
proc me nikdo neporadi o.O .. neslo by tomu alespon matematicky nejak odlehcit ? at to tak neutilizuje ten rand().
diky
-
Není mi moc jasné čeho vlastně chceš dosáhnout... chceš zjistit monotonii fce na intervalu <a,b>?
-
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
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
-
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% ..
-
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
-
import numpy.random
#sory, sem si nemoh' pomoct ;)
-
>starenka: Promin, ale taky jsem si nemohl pomoct ;D
[příloha smazaná administrátorem]
-
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
-
mozna jsem uplne vedle, ale teoreticky vim, ze pro rand 2(1..10) muzu pocet moznosti spocitat takto:
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
-
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? :)
-
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:
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
-
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.
-
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)
-
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
-
@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
-
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...
-
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
-
Tam není faktoriál, ale suma - nic se nenásobí, sčítá se.
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
-
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
-
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š.
-
Ntz, při vší úctě, vymejšlíš kraviny.
-
dyk procento ziskas jako pocet kombinaci / pocet moznosti .. tzn pro 8:
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
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
-
podle me potrebujes umet pocitat ten inkrement po tech levelech eg 1-4-5-10-20-35..limit .. a to bude nejaka osliva funkce
-
http://mathworld.wolfram.com/Dice.html