#########
# Cas 4 #
#########

# 1)
# Ulovljen je ruski spijun u SAD. Agent FBI\CIA je uzeo revolver
# (sa 6 metkova) i stavio dva metka jedan pored drugog.
# Puca u sebe (agent) i nista. Prazno.
# Posle agent prisloni revolver ka glavi spijuna i kaze:
# "Mogu sad da izvrtim bubanj, a mogu i da ne menjam nista"
# Sta treba da odabere spijun da bi povecao sanse za prezivljavanje?

# Pre svega smo teorijski resili i objasnili zadatak na tabli i dobili smo da je tacan odgovor da treba da ne menjamo nista,
# jer u slucaju kada zavrtimo bubanj imamo 2/3 da prezivimo, dok u slucaju kada nista ne menjamo 3/4.

# Ideja: napisacemo kod koji ce da proverava kolika je verovatnoca da NE prezivimo ukoliko ne menjamo nista.
# Ocekuje se da rezultat bude ~0.25, jer 1/4 je verovatnoca da ne prezivimo ako ne menjamo nista.
# Kako su metkovi postavljeni jedan za drugim, dovoljno je da simuliramo mesto prvog, drugi ide odmah nakon njega.
# To cemo odraditi pomocu sample funkcije, samo sto cemo ovog puta da sample-ujemo od 0 do 5, jer mod 6 (u R-u to je %%6)
# vraca brojeve {0,1,2,3,4,5}.

# Kad smo postavili metkove, dalje proveravamo da li NISU u prvom otvoru (to je nama 0 u kodu), 
# jer nas samo takvi slucajevi
# zanimaju. Jer imamo jasno zadatu uslovnu verovatnocu da se desio dogadjaj 
# da je agent preziveo prvi potez.
# I kada udjemo u taj if, samo jos ispitamo u kojim slucajevima nas spijun NECE da prezivi.
# Na kraju samo vratimo odnost ta dva brojaca.
revolver <- function()
{
  x = sample(0:5, 1) #vraca jedan broj izmedju 1 i 6 i to je mesto prvog metka, drugi je odmah posle njega.
  y = (x+1) %% 6 # mesto drugog metka.
  if(x != 0 & y != 0) # to mora da bude, jer je agent preziveo.
  {
    if(x == 1)
    {
      return(cbind(1,1)) # racunamo slucajeve kada se isplati vrteti.
    }
    return(cbind(0, 1)) 
  }
  return(cbind(0, 0))
}
N = 10000
rezultat = rowMeans(replicate(N, expr = revolver(), simplify = TRUE))
rezultat[1]/rezultat[2]



# 2) 
# Pod pretpostavkom da su verovatnoce radjanja zenske i muske dece jednake,
# ispitati nezavisnost sledecih dogadjaja:
# A - nisu sva deca istog pola, B - medju decom najvise jedna devojcica.
# a) u porodici sa troje dece,
# b) u porodici sa cetvoro dece.
# Samo cemo na tabli da uradimo. 
# Probajte sami simulaciju da napisete posle.

# 3)
# Na slucajan nacin biraju se dve karte iz standardnog spila od 52 karte. Koja
# je verovatnoca da prva karte nije sa likom (kralj, dama ili zandar) a da
# druga karte je karta sa likom, ako:

# a) vratimo u spil prvu kartu pre izvlacenja druge
# b) ne vracamo prvu kartu pre izvlacenja druge


# Neka su A i B sledeci dogadjaji:
# A - prva izvucena karta nije sa likom
# B - druga karta je sa likom

# a) 
# U ovom slucaju, kada izvlacimo karte sa vracanjem, A i B su nezavisni 
# (jer se eksperiment vrsi pri istim uslovima dva puta)
# dogadjaji, pa je P(AB)=P(A)P(B)= 40/52 * 12/52 = 0.1775

# b) 
# U slucaju bez vracanja, A i B nisu nezavisni dogadjaji pa vazi:
# P(AB)=P(A)P(B|A)= 40/52 * 12/51 = 0.1809


karte <- function(vracanje) 
{
  # kreiramo spil karata
  spil = c(rep(1:10, 4), rep("J", 4), rep("D", 4), rep("K", 4))
  
  
  izvucene_karte = sample(spil, 2 , replace = vracanje)
  
  prva_karta = izvucene_karte[1]
  druga_karta = izvucene_karte[2]
  
  
  ifelse(prva_karta %in% c("J", "D", "K")  & druga_karta %in% 1:10, return(1), return(0))
}


# Sa vracanjem:

rezultat_sa_vracanjem = replicate(100000, karte(TRUE))
mean(rezultat_sa_vracanjem)

# Bez vracanja:

rezultat_bez_vracanjem = replicate(100000, karte(FALSE))
mean(rezultat_bez_vracanjem)

# posto je razlika u verovatnocama mala, aproksimacije nam ne daju dovoljno
# jasne rezultate posle malog broja simulacija, zbog toga je dato n = 1000000


# 4)
# Iz segmenta [0, 1] se na slucajan nacin biraju dva broja nezavisno jedan od drugog.
# Dogadjaj A je da je zbir brojeva manji od 1,
# a dogadjaj B da je proizvod brojeva manji od 2/9.
# Odrediti verovatnoce dogadjaj A i B pomocu simulacije.
# Ispitati nezavisnost dogadjaja A i B (Monte Karlo metodom).

nezavisnost <- function()
{
  indikator_A = 0
  indikator_B = 0
  
  brojevi = runif(n = 2, min=0 , max=1)
  if(brojevi[1] + brojevi[2] < 1)
  {
    indikator_A = 1
  }
  if(brojevi[1] * brojevi[2] < 2/9)
  {
    indikator_B = 1
  }
  indikator_preseka = indikator_A * indikator_B
  
  return(cbind(indikator_A, indikator_B, indikator_preseka))
}

rezultati = rowMeans(replicate(100000, expr = nezavisnost(), simplify = TRUE))
rezultati

# Provera nezavisnosti
rezultati[1] * rezultati[2]
rezultati[3]
# Ako su brojevi blizu, mozemo pricati o mogucoj nezavisnosti, u suprotnom ne.



# Formula totalne verovatnoce: P(A)=P(A|B)*P(B) + P(A|B^c)*P(B^c)
# Bajesova formula: P(A|B) = P(A)*P(B|A)/P(B)

# 5) 
# Poznato je da su 5% osoba muskog pola daltonisti i 0.25% zenskog pola.
# Iz skupa koji sadrzi isti broj zena i muskaraca odabrana je jedna osoba.
# Ako je izabrano lice daltonista, naci verovatnocu da je to muskarac.

# Resenje:
# Oznacimo sa 
# A - izabran je daltonista.
# H_1 - izabran je muskarac
# H_2 - izabrana je zena

# Trazi se da nadjemo P(H_1 | A). Sto se moze raspisati prema Bajesovoj formuli
# P(H_1 | A) = P(A | H_1) * P(H_1)/ P(A)
# Dalje racunamo:
# P(H_1) = 1/2 - prema uslovu zadatka
# P(A | H_1) = 0.05 - opet prema uslovu
# P(A) = P(A | H_1) * P(H_1) + P(A | H_2) * P(H_2) = (0.05+0.0025)/2


# 6)
# Verovatnoca da se knjiga nalazi u biblioteci je p.
# Ako je knjiga u biblioteci, sa istom verovatnocom se nalazi
# na jednoj od n polica. Pregledano je m (m<n) polica i knjiga nije nadjena. 
# Kolika je sada verovatnoca
# da je knjiga u biblioteci?
# Na tabli cemo resiti.


# Slucajno lutanje po pravoj. Definicija.


# 7) Iscrtati trajektoriju duzine N pomeranja cestice, koja na slucajan nacin ide po pravoj. 
# Pravi korake -1 i +1.

cestica <- function(N)
{
  pomeranja = sample(c(-1, 1), N, replace = TRUE)
  pozicija = cumsum(pomeranja)
  plot(pozicija, type = 'o')
}
cestica(100)



# 8)
# Neka je igrac A u kazinu i igra slot-masinu. Preostalo mu je 5$.
# Svaki pokusaj ga kosta jedan dolar, ali moze da zaradi 
# 1$ ako pobedi (pobedjuje sa verovatnocom p,  1>p>0). Igrac zavrsava igru ako dostigne 10$. 
# Naci verovatnocu da ce on 
# to uspeti ako je poznato da ce igrati najvise N puta. Proveriti zakljucak simulacijom.

#z=p+(1-p)*z^2
# z - oznacicemo totalnu verovatnocu da se igrac pomerio za jedan dolar unapred.
# Tada mozemo na sledeci nacin da zapisemo moguce ishode za tu verovatnocu: (sa 1-pobeda, 0-poraz)
# {1, 011, 00111, 01011, ....} bitno je da je na kraju sigurno 1.
# Tada prema formuli potpune verovatnoce dobijamo: 
# z = p + (1-p)*z^2, gde je prvi sabirak - verovatnoca da smo odmah pobedili, a drugi da smo prvo izgubili, 
# a onda dva puta se desilo dogadjaj verovatnoce z.

#Resenja te jednacine po z (za dato p) su:
# z_1 = 1
# z_2 = p/(1-p), za p <= 1/2, jer inace z nije verovatnoca.
# I time smo dobili pomeranja za jedan dolar verovatnoce z, svaki pomeraj kapitala za jedan dolar je nezavisan od prethodnog,
# pa je verovatnoca da predjemo sa 5$ na 10$ zapravo z^5.

# Sto se tice simulacije  - prosledjujemo verovatnocu da smo dobili u jednoj igri na slot masini (p),
# pocetni kapiral (kapital), broj_koraka - koliko najvise puta ce da odigra igrac (N iz postavke zadatka), n - koliko puta
# simuliramo.


igrac <- function(p, kapital = 5, N)
{
    # sample-ujemo N puta rezultate igranja  i gledamo kako se ponasao njegov kapital
    igra = sample(c(1, -1), N , replace = TRUE, prob = c(p, 1-p)) 
    
    # Pocetna pozicija pozicija kapitala, je ono sto smo prosledili u funkciji.
    trajektorija = kapital + cumsum(c(0, igra))
    # moglo je i: trajektorija = cumsum(c(kapital, igra))
    
    # Ako je 0, onda nije dostigao svojih 10$.
    kraj_igre = 0
    
    # Inace, ako jeste, onda belezimo kad je to bilo.
    if(sum(trajektorija >= 10) >= 1)
    {
      kraj_igre = which(trajektorija == 10)[1]
    }
  # Vratimo T\F u zavisnosti od toga da li je dostigao 10$.
 return(kraj_igre > 0)
}
rezultat = replicate(10000, expr = igrac(0.45, 5, 1000), simplify = TRUE)
mean(rezultat)
p = 0.48
(p/(1-p))^10

# Dok z p > 0.5
rezultat = replicate(1000, expr = igrac(0.51, 5, 1000), simplify = TRUE)
mean(rezultat)


