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)
}
# 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
# 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