# ~~~ Cas 2 ~~~ # 20.10.2017. # Napomena: Cio broj koji zadamo kao seed je pocetna tacka koja se koristi za # generator sekvence slucajnih brojeva (pretpostavimo da koristimo isti # generator pseudo-slucajnih brojeva) i zbog toga ako zadamo isti argument # funkciji set.seed() prije poziva slucajne funkcije dobicemo isti rezultat # svaki put. To nam koristi ako zelimo da generisemo neke slucajne brojeve samo # jednom a da posle radimo sa tim istim uzorkom. set.seed(1) runif(10) # Zadatak 0 # Simuliraj bacanje regularne kockice za igru. sample(6, 1, prob = rep(1/6,6)) # Izracunati frekvenciju pojavljivanja sestice u 1000 izvodjenja eksperimenta. # Nacrtati histogram frekvencija s<-sample(6, 1000, prob = rep(1/6,6), replace = TRUE) mean(s==6) # ekvivalentan poziv sum(s==6)/length(s) hist(s) # Zadatak 1 # Bacaju se istovremeno kocka za igru i novcic. # a) Ispisati skup svih ishoda. kocka<-c(1,2,3,4,5,6) novcic<-c("pismo", "glava") matrica.ishoda<-outer(kocka, novcic, FUN="paste", sep="") # b) Da li su svi ishodi jednako vjerovatni? Ocijeniti vjerovatnocu ishoda # "5pismo". # Upisujemo sve ishode u vektor vektor.ishoda<-as.vector(matrica.ishoda) # Pozicija ishoda pismo5 u vektoru ishoda pismo5<-which(vektor.ishoda=="5pismo") # Generisemo vektor od hiljadu elemenata iz skupa 1:12 na slucajan nacin simulacije<-sample(length(vektor.ishoda), 1000, replace = TRUE) # Ocjena vjerovatnoce na osnovu frekvencija mean(simulacije==pismo5) # Zadatak 2 # Igraci baca strelicu na tablu na kojoj se nalaze tri koncentricna kruga # poluprecnika 5, 10 i 15 cm. Najveci krug je upisan u kvadrat stranice 30 cm. # Smatra se da je svaki dio table ravnopravan. # a) Napisati funkciju strelica() koja simulira opisanu igru. (Funkcija treba da # vrati 1-ako je pogodjen prvi krug, 2 za drugi i 3 za treci, -1 ako je strelica # van krugova) strelica<-function(){ # Postavljamo koordinatni pocetak u centar kruga i na slucajan nacin biramo x i # y koor- dinatu za pogodjenu tacku, (x,y) su iz [-15,15]x[-15,15] poz<-runif(2, -15, 15) # racunamo rastojanje tacke od centra r<-norm(poz, type="2") # ekvivalentno: sqrt(sum(poz^2)) if(r<=5) return(1) else if(r>5 & r<=10) return(2) else if(r>10 & r<=15) return(3) else return(-1) } # b) Ocijeniti vjerovatnocu da je da je pogodjen 1., odnosno 2. krug. # Koristimo funkciju replicate cijim pozivom # 1000 puta pozivamo funkciju strelica() i rezultate tih poziva smjestamo # u jedan vektor simulacije<-replicate(1000, strelica(), simplify = "array") # Napomena: Ako fji replicate proslijedimo argument simplify= F, vratice listu table(simulacije) frekvencije<-table(simulacije)/1000 frekvencije # Ako izracunamo vjerovatnoce teorijski, gledajuci kao gemetrijsku vjerovatnocu # po formuli: P(A)=m(A)/m(kvadrat) , dobicemo priblizno: # -1 1 2 3 # 0.21460 0.08727 0.26180 0.43633 # c) Igraci A i B naizmjenicno bacaju po tri strelice na tablu. Na pocetku igre # imaju po 20 poena. Ako se pogodi prvi krug gubi se 1 poen, drugi 3, treci 5 i # van kruga 10 poena. Igru zapocinje igrac A, a zavrsava se kada jedan od igraca # izgubi sve poene. Simulirati igru. Napisati funkciju pikado() koja vraca 1 ako # je pobijedio igrac A, odnosno 2 ako je pobijedio igrac B. # Pravimo pomocnu fju koja racuna koliko treba oduzeti poena igracu nakon jedne # partije. Prosledjujemo joj vektor sa oznakama pogodjenih polja poeni<-function(x){ # racunamo koliko je puta pogodjeno svako polje krug.1<-sum(x==1) krug.2<-sum(x==2) krug.3<-sum(x==3) kvadrat<-sum(x==-1) return(krug.1 + 3*krug.2 + 5*krug.3 +10*kvadrat) } # Hocemo da napisemo funckiju pikado() koja vraca 1 ako je pobijedio igrac A, a # 2 u suprotnom. pikado<-function(){ poeni.A<-20 poeni.B<-20 # Napomena: # Indikator da je igrac A na redu: U aritmeticki izrazima T ce imati vr 1, a F 0 A.na.potezu<-TRUE while(poeni.A*poeni.B>0){ # Oduzimamo poeni igracu koji je na potezu poeni.A<-poeni.A - A.na.potezu*poeni(replicate(3,strelica())) poeni.B<-poeni.B - (!A.na.potezu)*poeni(replicate(3,strelica())) # Mijenjamo igraca A.na.potezu<-!A.na.potezu } # Ko prvi izgubi poene izgubio je igru. ifelse(poeni.A<=0 ,return (2), return(1)) } # Ocijeniti vjerovatnocu da pobijedi igrac koji zapocinje igru, odnosno igrac A. # Sta se ocekuje? s<-replicate(1000,pikado()) mean(s==1) mean(s==2) # Zadatak 3 # (a) Neka igrac ima pocetni kapital A i on baca kockicu. Ako dobije 1, 3 ili 5, # njegov kapital se uveca za 1 dinar, a u suprotnom izgubi 1 dinar. Za N # ponovljenih bacanja, nacrtati trajektoriju njegovog kapitala u zavisnosti od # trenutnog bacanja. (dozvoljeno je da igrac ide u minus) trajektorija<-function(A, N){ a<-numeric(N) s<-sample(6, N, replace = TRUE) a[1]<-A for(i in 1:N) ifelse(s[i]%%2==1, a[i+1]<- a[i]+1, a[i+1]<- a[i]-1) return(a) } # Crtamo trajektoriju za pocetni kapital 15 i broj bacanja 20 plot(trajektorija(5,20), type="o", col="blue") # 2. nacin: Hocemo da izbjegnemo petlju # Kumulativna suma vektora x=(x1,x2,...,xn) je vektor # x = (x1, x1+x2, x1+x2+x3, ... , x1+x2+x3+...+xn) trajektorija2<-function(A,N){ s<-sample(6, N, replace = T) i<-ifelse(s%%2==1, 1, -1) trajektorija<-cumsum(i)+A return(trajektorija) } plot(trajektorija2(5,20), type="o", col="red") # Primijetimo da je drugi nacin efikasniji system.time(trajektorija(1, 10000)) system.time(trajektorija2(1,10000)) # a.1) Ocijeniti vjerovatnocu da igrac zavrsi u plusu posle N partija plus<-function(A, N){ a<-trajektorija2(A, N) ifelse(a[N]>0, return(1), return(0)) } frekv.plusa<-function(A, N, broj.sim=1000){ simulacije<-replicate(broj.sim, plus(A, N)) f<-mean(simulacije) return(f) } frekv.plusa(5,20) frekv.plusa(5,100) frekv.plusa(100,1000) # Zadatak 4 # Odrediti povrsinu ispod grafika funkcije sin(x) na intervalu [0,1] uz # pomoc MK metode. # [Monte Karlo metoda] MK<-function(N){ # N-broj tacaka koje generisemo x<-runif(N, 0, 1) y<-runif(N, 0, 1) povrsina<-sum(ydrugi%%13) return(1) else if(prvi%%13 0.5 pada glava. Smisliti fer # zreb izmedju dva igraca koristeci taj novcic. # Ideja je da definisemo koji ishodi pretstavljaju pobjedu za igraca 1 odnosno 2. # Npr neka se baca novcic dva puta i kazemo da je igrac 1 pobijedio ako se dogo- # dio ishod pismo-glava, a igrac 2 ako se dogodio ishod glava-pismo. Na ovaj na- # cin vjerovatnoce pobjede oba igraca su jednake. Provjerite ovaj rezultat # eksperimentalno. nefer.igra<-function(p){ # neka 0 predstavlja pismo, a 1 glavu novcic<-sample(c(0,1), 2, replace=TRUE, prob = c(p,1-p)) if(novcic[1]==0 & novcic[2]==1) return (1) else if(novcic[1]==1 & novcic[2]==0) return (2) else return (0) } # Sada hocemo da provjerimo odnos pobjeda igraca 1 odnosno 2 u 10000 odigranih # partija. Neka je p=0.1, 1-p=0.9 r<-replicate(10000, nefer.igra(0.1)) sum(r==1)/sum(r==2) # Odnos je priblizno isti, sto znaci da smo napravili fer igru. # *************************************************************************** # Zadaci za vjezbu: # *************************************************************************** # ( Zadatke raditi prvo teorijski a zatim provjeriti rezultat simulacijama, # ako je to pogodno. ) # 1. Izracunati vjerovatnocu da cifre desetica i jedinica slucajno izabranog # prirodnog broja budu jedinice. # 2. Iz kutije u kojoj se nalaze cedulje oznacene brojevima od 1 do n izvlaci # se jedna po jedna cedulja # a) sa vracanjem # b) bez vracanja # Izracunati vjerovatnocu da budu redom izvuceni brojevi 1,2,3,...,n. # 3. Iz segmenta [0,1] na slucajan nacin se biraju dva broja. Izracunati vjero- # vatnocu da njihov zbir bude manji od 1, a proizvod veci od 2/9. # 4. Hotel ima n soba poredjanih jedna do druge u pravoj liniji. Na slucajan # nacin k gostiju se razmjesta po sobama (k