
#### 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). Kretanje se
# zavrsava kada kornjaca dodje do vode.
# a) Simulirati kretanje kornjace i nacrtati trajektoriju kretanja
# b) Ocijeniti vjerovatnocu da ce kornjaca posle N koraka doci do vode
# c) Teorijski, izracunati vjerovatnocu da ce kornjaca u nekom trenutku doci do
# vode.



kornjaca <- function(N, p) {
  
  rastojanje <- 14.5
  
  koraci <- sample(c(-1, 1), size = N, replace = TRUE, prob = c(p, 1 - p))
  
  # Drugi nacin:
  # koraci <- runif(N, 0, 1)
  # koraci[which(koraci < p)] <- -1
  # koraci[which(koraci >= 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.















