#########
# CAS 3 #
#########



# Definisati pojmove: uslovne verovatnoce, Bajesove formule.


# 1) 
# Ako imamo skup elementarnih dogadjaja 
# Omega = {a, b, c} 
# i njihove verovatnoce 
# P(a) = 1/2, 
# P(b) = 1/3, 
# P(c) = 1/6, 
# Odrediti verovatnocu svih mogucih dogadaja.


# 2) 
# Ako je P(AB)=1/4, 
# P(A^c)=1/3 
# i P(B)=1/2, 
# odrediti P(AuB)=?
# Taj zadatak na tabli radimo.

# Resenje bi trebalo da bude 11/12.


# 3)
# Oznacimo sa A, B i C ocene koje mogu da se dobiju na jednom predmetu. 
# Predmet polazu Milica i Stefan. 
# Verovatnoca da Stefan dobije ocenu B je 0,3. 
# Verovatnoca da Milica dobije ocenu B je 0,4.
# Verovatnoca da niko ne dobije ocenu A, 
# ali da bar neko dobije ocenu B je 0,1. 
#Pronaci verovatnocu da bar neko dobije ocenu B, 
# ali da niko ne dobije ocenu C.


# 4) 
# Kockica za igru je tako napravljena da je verovatnoca 
# padanja nekog broja proporcionalna kolicini tackica na toj strani.
# (Tj verovatnoca da padne 6 je tri puta veca nego 2).
# Odrediti verovatnocu da padne paran broj. 
# Simulirati i oceniti verovatnocu.

kockica <- function(N)
{
  # Simulirano vektor duzine N, koji ce da sadrzi svih N rezultata bacanja (simulacije) kocke.
  x = sample(1:6, N, replace = TRUE, prob = c(1/21, 2/21, 3/21, 4/21, 5/21, 6/21) ) # realna treba da bude 12/21~0.57
  # Promenljiva brojac u jednom redu sabira sve slucajeve kada smo dobili paran broj.
  # Tako izbegavamo sve silne for petlje i if komande. A vec ste mozda i sami videli koliko to znaci ovde.
  brojac = mean(x %% 2 == 0)
  # Vracamo uspehe/(ukupno bacanja)
  return(brojac)
}
kockica(100000)



# 5) 
# Tri strelca nezavisno jedan od drugog gadjaju u 
# cilj  po jednom, pogadjajuci ga sa verovatnocama 4/5, 3/4, 2/3 respektivno.
# Ako su postigli tacno  jedan pogodak, naci verovatnocu 
# da je treci strelac promasio. Proveriti rezultat simulacijom.

strelci <- function(N, p1 = 4/5, p2 = 3/4, p3 = 2/3)
{
  # Posto gadjaju nezavisno za svakog mora svoj vektor pogodaka. Na osnovu kojeg cemo odluciti da li je u datim gadjanju 
  # cilj pogodjen ili ne.
  x = runif(N, 0, 1)
  y = runif(N, 0, 1)
  z = runif(N, 0, 1)
  
  # Vektor koji pokazuje da li pogodio ili ne. Ukoliko je u i-tim pokusaju pogodak bice vrednost TRUE na i-tom elementu
  # vektora vektor1(2)(3)
  vektor1 = x < p1
  vektor2 = y < p2
  vektor3 = z < p3
 
  # Naredne tri promenljive ce da beleze koliko puta je svako od njih pogodio tacno jednom, tj belezice slucajeve 
  # kada samo prvi, odnosno samo drugi, odnosno samo treci strelac pogodio cilj.
  pogodio1 = sum(vektor1 == TRUE & vektor2 == FALSE & vektor3 == FALSE)
  pogodio2 = sum(vektor2 == TRUE & vektor1 == FALSE & vektor3 == FALSE)
  pogodio3 = sum(vektor3 == TRUE & vektor1 == FALSE & vektor2 == FALSE)
  
  # Vracamo vrednost koja nama treba. Obratite paznju da je to isto kao kada bismo vratili:
  # (pogodio1+pogodio2)/(pogodio1+pogodio2+pogodio3).
  return(1-pogodio3/(pogodio1+pogodio2+pogodio3))
}
strelci(100000, 4/5, 3/4, 2/3)
7/9


# 6) 
# Istorijski spisi svedoce o tome da je kralj jednog drevnog kraljevstva
# poticao iz porodice sa dvoje dece.
# Izracunati verovatnocu da je kralj imao sestru ako:
# a) nema dodatnih informacija
# b) kralj je bio starije dete



# 7)
# U red sa 10 sedista na slucajan nacin sedaju deset osobe. 
# Izracunati verovatnocu da ce osoba Y sesti izmedju U i V,
# ako se zna da U i V ne sede jedno do drugog, jer su u svadji.

posvadjani_ljudi <- function()
{
  # Imamo 10 mesta, stoga sample() za 10 pozicija i recimo pratimo brojeve 1(U),
  # 2(V) i 3(Y)
  raspored = sample(1:10, 10, replace = FALSE)
  
  # Nalazimo mesto sa najmanjim brojem, tj 1
  mesto_u = which.min(raspored)
  mesto_v = which(raspored == 2)
  mesto_y = which(raspored == 3) 
  if(mesto_u != mesto_v + 1 & mesto_u != mesto_v - 1)
  {
      if( (mesto_v > mesto_y & mesto_u < mesto_y ) | (mesto_v < mesto_y & mesto_u > mesto_y )  )
      {
        return(cbind(1, 1) )
      }
    return(cbind(0,1))
  }
  return(cbind(0, 0) )
}
n = 100000
rezultat_funkcije = rowMeans(sapply(vector(length = n), function(x) posvadjani_ljudi()))
rezultat = rezultat_funkcije[1]/rezultat_funkcije[2]
rezultat
5/12
# ili
rezultat_drugi_nacin = rowMeans(replicate(n = n, expr =  posvadjani_ljudi(), simplify = TRUE) )

rezultat2 = rezultat_drugi_nacin[1]/rezultat_drugi_nacin[2]
rezultat2

system.time(sum(sapply(vector(length = n), function(x) posvadjani_ljudi()) )/n)
system.time(sum(replicate(n = n, expr =  posvadjani_ljudi(), simplify = TRUE) )/n)

# Nezavisnost:

# 8)
# Na slucajan nacin se bira broj izmedju {1, 2, ..., 22}. 
# Izracunati verovatnocu da je izabran paran broj,
# ako je poznato da je izabran broj deljiv sa 3.

deljivost <- function(N)
{
  biranje = sample(1:22, size = N)
  
  deljiv_sa_3 = sum(ifelse(biranje %% 3 == 0, 1, 0))
  
  deljiv_sa_6 = sum(ifelse(biranje %% 6 == 0, 1, 0))
  
  return(deljiv_sa_6/deljiv_sa_3)
}

# 9) 
# U kutiji se nalaze po tri bele i crne kuglice numerisane ciframa 1, 2, 3. 
# Iz kutije se na slucajan nacin bira jedna kuglica.
# Neka je A dogadjaj da je izabrana kuglica oznacena sa 1 ili 2.
# B - dogadjaj da je kuglica bele boje.
# Ispitati nezavisnost dogadjaja A i B.

# Bajesova teorema

# 10)
# Sa verovatnocom 1/2 su postavili pare u jedan od 8 sanducica.
# Otvorena su 7 sanducica i nije bilo para.
# Koja je verovatnoca da se nalaze u 8.? 
# Simulirati taj dogadjaj N puta i pomocu simulacije 
# oceniti verovatnocu.


# Kod je mozda kratak, ali je zato problem jako netrivijalan i prikazuje da intuicija nije bas dobra u tim pitanjima.
sanduce <- function(N)
{
  # br - promenljiva koja ce da belezi koliko puta je 
  # novac u osmom sanducicu.
  br = 0
  # br2 - promenljiva koja ce da belezi koliko puta 
  # je novac u 8. sand, kao i koliko puta nije uopste u njima.
  br2 = 0
  
  
  # u funkciji sample imamo 9 vrednosti, jer smo slucaj da nije uopste u sanducice nazvali 9 i stoga je verovatnoca tog 
  # dogadjaja bas 1/2.
  q = sample(1:9, size = N, prob = c(1/16, 1/16, 1/16, 1/16, 1/16, 1/16, 1/16, 1/16, 1/2 ), replace = TRUE)
  # Funkcija ifelse(test, ako je prosao if, ako nije prosao if)
  # U nasem slucaju test: da li je u osmom. Ako jeste onda se br poveca za jedan, ako nije onda nista.
  br = sum(ifelse(q == 8,  1, 0))
  # Slicno za br2, samo belezimo kad je u osmom i van svih sanducica.
  br2 = sum(ifelse(q > 7, 1, 0))
  
  # Vracamo taj odnos, jer se trazi uslovna verovatnoca kada sigurno znamo da nije u prvih 7, zbog toga te slucajeve nismo
  # nikako ne belezili u kodu iznad, jer moramo da ih ignorisemo da bismo nasli trazenu verovatnocu.
  return(br/br2)
}
sanduce(100000)


