Primjer 1: Simulirati bacanje regularne kockice za igru. Izračunati frekvenciju pojavljivanja šestice u 1000 izvođenja eksperimenta.
sample(6, 1, prob = rep(1/6,6))
## [1] 1
s <- sample(6, 1000, prob = rep(1/6,6), replace = TRUE)
mean(s == 6) # ekvivalentan poziv sum(s==6)/length(s)
## [1] 0.154
Primjer 2: Kockica za igru je tako napravljena da je vjerovatnoća padanja nekog broja proporcionalna količini tackica na toj strani. Odrediti vjerovatnoć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.5757
# 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)
## [1] 1.021205
# Odnos je priblizno isti, sto znaci da smo napravili fer igru.
Primjeri slučajnog lutanja
Zadatak1:
Neka igrač ima početni 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 igrač 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")
Ocijeniti vjerovatnoću da igrač završi 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)
## [1] 0.894
frekv.plusa(5, 100)
## [1] 0.713
frekv.plusa(100, 1000)
## [1] 1
Zadatak 2 (51. zadatak sa spiska)
Simulirati kretanje čovjeka i nacrtati trajektoriju kretanja.
Ocijeniti vjerovatnoću da će čovjek posle \(N\) koraka pasti u provaliju.
pijanica <- function(N, p) {
rastojanje <- 1
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)[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
pijanica(20, 0.7)
## [1] 1
# Iskljuciti plot!
# p>0.5
mean(replicate(1000, pijanica(1000, 0.7)))
## [1] 1
# p<0.5
mean(replicate(10000, pijanica(1000, 0.4)))
## [1] 0.6615
mean(replicate(10000, pijanica(1000, 1/3)))
## [1] 0.4935
# Uporedite rezultate sa teorijskim.
Zadatak 3: (50. zadatak sa spiska)
izbori <- function(m, n) {
# Biramo m ljudi koji su glasali za A
glasovi.A <- sample(1:(m + n), size = m)
# Ostali su glasali za B
glasovi.B <- (1:(m + n))[-glasovi.A]
glasovi <- numeric(m + n)
# Glasovima za A dodijelimo vrijednost 1 a za B -1
glasovi[glasovi.A] <- 1
glasovi[glasovi.B] <- -1
# Zanimaju nas one trajektorije koje nisu dosle do 0 (A je uvijek vodio)
trajektorija<-cumsum(glasovi)
ifelse(any(trajektorija<=0),0,1)
}
mean(replicate(10^5,izbori(23,16)))
## [1] 0.1796
# Poredimo sa teorijskim rezultatom.
(23-16)/(23+16)
## [1] 0.1794872