Primer 1: Simulirati bacanje regularne kockice za igru. Izračunati frekvenciju pojavljivanja šestice u 1000 izvođenja eksperimenta.

# Hocemo da ponovimo ovaj eksperiment vise puta i da izracunamo frekvenciju pojavljivanja sestice. Prirodno je da je ta frekvencija neka ocena verovatnoce da padne sestica.
s <- sample(6, 1000, prob = rep(1/6,6), replace = TRUE)

mean(s == 6)  # ekvivalentan poziv sum(s==6)/length(s)
## [1] 0.172

Primer 2: Kockica za igru je tako napravljena da je verovatnoća padanja nekog broja proporcionalna količini tačkica na toj strani. Odrediti verovatnoću 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)
## [1] 0.5642
# Teorijsko resenje: 
2/21+4/21+6/21
## [1] 0.5714286

Primer 3: Iz kutije u kojoj se nalaze kuglice oznacene brojevima od 1 do n izvlaci se n kuglica, jedna po jedna , a) bez vracanja b) sa vracanjem. Izracunati verovatnocu da su redom izvucene kuglice 1,2,…,n.

# argument n je koliko kuglica izvlacimo, a r je da li izvlacimo sa vracanjem
# ili bez vracanja, pa moze biti T ili F

kuglice <- function(n, r){
  
  s <- sample(1:n, n, replace = r)     # na slucajan nacin izlvlacimo n kuglica
  
  # hocemo da nam ovaj funkcija vrati T ako smo dobili bas niz 1,2,...,n,
  # a F u suprotnom
  
  x <- 1:n
  all(s==x)   # pozivom s==x poredimo vektore clan po clan
  
}

# kako nas zanima verovatnoca dogadjaja da bude izvucen niz 1,2,..,n
# cilj je da ponovimo ovaj esperiment veliki broj puta i izracunamo frekvenciju
# trazenog dogadjaja

# uzmimo n=3 i izvlacenje sa vracanjem 

mean(replicate(10^4, kuglice(3,T)))
## [1] 0.0371
# sa casa znamo da je stvarna verovatnoca 

1/3^3
## [1] 0.03703704
# uzmimo n=3 i izvlacenje sa vracanjem 

mean(replicate(10^4, kuglice(3,F)))
## [1] 0.1687
# sa casa znamo da je stvarna verovatnoca 

1/factorial(3)
## [1] 0.1666667

DOMACI: Odrediti frekvencije ovih dogadjaja na osnovu simulacija u R-u.

Primer 4: Na turniru treba igrati 3 partije stonog tenisa protiv sampiona A i slabijeg igraca B, po jednoj od sema A-B-A ili B-A-B. Nagrada se dobija ako se pobedi u bar dve partije uzastopno. Koja sema je povoljnija?

# Simuliramo 1 turnir po datoj semi
# Argumenti p_a i p_b odredjuju verovatnoce da u partiji pobedi A, odnosno B.
# Argument sema odredjuje po kojoj semi radimo "ABA" ili "BAB"
# Vracamo 1 ako smo dobili nagradu, a 0 ako nismo
turnir <- function(p_a, p_b, sema = "ABA") {
  sema_vec <- unlist(strsplit(sema, split = ""))
  
  vrv_seme <- ifelse(sema_vec == "A", p_a, p_b)
  
  nase_pobede <- sapply(vrv_seme, function(p) {
    sample(c(0, 1), 1, prob = c(p, 1-p))
    }
  )
  
  return(nase_pobede[1] + nase_pobede[2] == 2 ||
           nase_pobede[2] + nase_pobede[3] == 2)
}

# Simulirajmo semu ABA 10000 puta i vidimo verovatnocu da pobedimo
mean(replicate(1e4, turnir(0.7, 0.2, "ABA")))
## [1] 0.4099
# Simulirajmo semu BAB 10000 puta i vidimo verovatnocu da pobedimo
mean(replicate(1e4, turnir(0.7, 0.2, "BAB")))#
## [1] 0.2885
# Veca je verovatnoca da dobijemo po prvoj semi! (Uporedite rezultate sa teorisjkim resenjem sa casa.)

Primer 5: Igrač baca strelicu na tablu na kojoj se nalaze tri koncentrična kruga poluprečnika 5, 10 i 15 cm. Najveći 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 pogođen prvi krug, 2 za drugi i 3 za treći, -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)      

}
  1. Oceniti verovatnocu 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)
## simulacije
##  -1   1   2   3 
## 226  83 261 430
frekvencije<-table(simulacije)/1000
frekvencije
## simulacije
##    -1     1     2     3 
## 0.226 0.083 0.261 0.430
# Ako izracunamo verovatnoce teorijski, gledajuci kao geometrijsku verovatnocu 
# po formuli: P(A)=m(A)/m(kvadrat) , dobicemo priblizno:

#  -1           1             2         3

#  0.21460    0.08727    0.26180    0.43633
  1. Igrači A i B naizmenično bacaju po tri strelice na tablu. Na početku igre imaju po 20 poena. Ako se pogodi prvi krug gubi se 1 poen, drugi 3, treci 5 i van kruga 10 poena. Igru započinje igrač A, a završava se kada jedan od igrača izgubi sve poene. Simulirati igru. Napisati funkciju pikado() koja vraća 1 ako je pobedio igrač A, odnosno 2 ako je pobedio igrač 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)
## [1] 0.198