#### 2. cas ##### #### Simulacije #### # Zadatak 1 # Igrac 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()) 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 2 # (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") # 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 3 # Kockica za igru je tako napravljena da je vjerovatnoca padanja nekog broja # proporcionalna kolicini tackica na toj strani. (Tj vjerovatnoca da padne 6 je # tri puta veca nego 2). Odrediti vjerovatnocu da padne paran broj. s<-sample(1:6, 10000, replace = TRUE, prob = c(1/21,2/21,3/21,4/21,5/21,6/21)) mean(s%%2==0) # Zadatak 4 [Monty Hall problem] # Postavka problema: Pretpostavimo da ste u igri i dat vam izbor od troje vrata: # iza jednih je automobil, a iza preostalih su koze. Vi birate vrata, recimo vrata 1, a domacin # koji zna sta je iza vrata otvara druga vrata iza kojih je koza. Onda vam # ponudi da promijenite odluku i da izaberete druga neotvorena vrata. Da li je u # vasu korist da promijenite izbor? # Sta nam govori intuicija? # Insert iz serije "Brojevi" : # https://www.youtube.com/watch?v=P9WFKmLK0dc&feature=youtu.be # Simulacija Monty Hall problema monty.hall<-function(){ doors<-c("A", "B", "C") car<-sample(doors, 1) pick<-sample(doors)[1] open<-sample(doors[which(doors!=car & doors!=pick)],1) switchyes<-doors[which(doors!=pick & doors!=open)] ifelse(car==switchyes, return("yes"), return("no")) } # Racunamo frekvenciju pogodataka ako smo promijenili izbor r<-replicate(100000, monty.hall()) mean(r=="yes") mean(r=="no") # Razmotrimo ovu vjerovatnocu. Uvedimo hipoteze: # Hi<-kola su iza i-tih vrata, i=1,2,3 # P(Hi)=1/3 za sve i=1,2,3 # B- B su vrata koja otvara domacin # P(B|H1)=1/2 # P(B|H2)=0 # P(B|H3)=1 # P(B)=P(H1)P(B|H1)+P(H2)P(B|H2)+P(H3)P(B|H3)=1/3*1/2+1/3=1/2 # Iskoristimo Bjesovu teoremu: # P(H1|B)=P(B|H1)P(H1)/P(B)=(1/2*1/3)/ 1/2=1/3 # Dobijamo da treba da promijenimo odluku pri zadatim uslovima. U tom slucaju # pogodicemo poziciju kola sa vjerovatnocom 2/3, sto su simulacije pokazale. # Zadatak 5 # Slijepa kornjaca se nalazi na 14.5 cm od vode i na slucajan nacin pravi korake # duzine 1cm ka vodi, odnosno od vode (krecuci se po pravoj liniji). Koraci su # medjusobno nezavisni, a vjerovatnoca da ce kornjaca napraviti korak ka vodi je # p, dok je vjerovatnoca da ce napraviti korak od vode 1-p ( 0= p)] <- 1 # Sjetite se trajektorije sa 2. casa i funckije cumsum() trajektorija <- rastojanje + cumsum(koraci) # Ako hocemo da prekinemo kretanje kad kornjaca dodje do vode, tj kad nam # trajektorija presjece nulu: if (!all(trajektorija > 0)) # ili if(any(trajektorija)<=0) trajektorija <- trajektorija[1:which(trajektorija == -0.5)[1]] # Crtamo trajektoriju: #plot(trajektorija, type = "o" , col = "blue") # Za drugi dio zadatka trebaju nam ishodi kod kojih posle N koraka dolazi do # vode ifelse(trajektorija[length(trajektorija)] < 0, 1, 0) # Ovdje vidimo da nije neophodno pisati return, vratice poslednji izraz } # 2) Uzmimo neke konkretne vrijednosti za p i N kornjaca(20, 0.7) # Iskljuciti plot!!! # p>0.5 mean(replicate(1000, kornjaca(1000, 0.7))) # p<0.5 mean(replicate(1000, kornjaca(1000, 0.4))) # Uporedite rezultate sa teorijskim.