%--------------------------------------------------------------------------
% STATISTICA E ANALISI DEI DATI A/A 2015-16
%
% Simulazione del problema 1 / Modulo 1
%
% Un cappello contiene tre carte: 
% - una carta é nera su entrambi i lati; 
% - una carta é bianca su entrambi i lati; 
% -una carta é nera su un lato e bianca sull?altro. 
% Le carte vengono mescolate nel cappello, poi una viene estratta a caso e 
% appoggiata su di un tavolo.
%
% Se il lato visibile della carta é nero, qual é la probabilitá che l?altro
% lato sia bianco?
%
%--------------------------------------------------------------------------




clear all
close all

rng  default;

%codifico nero e bianco
nero   = 0;
bianco = 1;

% creo le tre carte
carta(1).lato(1) = nero;
carta(1).lato(2) = nero;

carta(2).lato(1) = bianco;
carta(2).lato(2) = bianco;

carta(3).lato(1) = nero;
carta(3).lato(2) = bianco;

% inizializzo i conteggi
num_nero_sopra = 0;
num_nero_sopra_and_sotto_bianco = 0;

% vettore per salvare iterativamente  i risultati (valore stimato di 
% P(sotto_bianco | nero_sopra) per n crescente 
p_cond = [];

% numero di prove
num_prove = 10000;

for n=1:num_prove
    
    % scelgo con probabilita' uniforme una delle 3 carte
    carta_idx = unidrnd(3);
    

    % scelgo campionando dalla distribuzione di Bernoulli il lato mostrato
    % (visibile): uso una binomiale con n = 1

    lato_idx  = binornd(1, 0.5) + 1; %indice lato visibile
    
    retro_idx = 2 - lato_idx + 1;    %indice lato non visibile
    
    %se il lato visibile e' nero...
    if carta(carta_idx).lato(lato_idx) == nero 
        
        %.... lo conteggio
        num_nero_sopra = num_nero_sopra + 1;
        
        % osservo  l'altro lato: se e' bianco...
        if carta(carta_idx).lato(retro_idx) == bianco
            
            % ... si e' verificato l'evento congiunto sopra nero e sotto
            %     bianco: lo conteggio
            num_nero_sopra_and_sotto_bianco = num_nero_sopra_and_sotto_bianco + 1;
            
        end
        % stima empirica della probabilita' condizionata 
        % P(sotto_bianco | nero_sopra)
        p_bianco_dato_nero = num_nero_sopra_and_sotto_bianco / num_nero_sopra;
            
        % accumulo i risultati ottenuti per n crescente
        p_cond = [p_cond p_bianco_dato_nero];
    end
end

num_nero_sopra

num_nero_sopra_and_sotto_bianco

p_bianco_dato_nero

n_prove = 1:length(p_cond);

limite = ones(length(p_cond)) * (1/3);

figure(1)
p = plot(n_prove,p_cond,'-', n_prove, limite,'r--');
p(1).LineWidth = 3;
p(2).LineWidth = 2;
title('Simulazione del gioco delle carte');
xlabel('n');
ylabel('P(bianco sotto | nero sopra )');

