import java.util.Scanner;


public class Simulation2 {

	   
    public static void main(String[]args){
       
        int choix = 4; // 1: loi simple, 2: loi exponentielle, 3: loi normale, 4: loi de Poisson
       
        int X[] = {1,2,3,4,5,6};//{1,2,3,5,4,8};
        double Px[] = {0.2,0.1,0.35,0.15,0.07,0.13};
        double esperance = 0, variance = 0;
        int iter = 10000;
        double U = 0; // nombre aleatoire
        double sum = 0, sumAi = 0, sumVar = 0;
        int Ai = 0; // alpha i
       
       
        switch(choix){
        // loi simple
        case 1:
            for(int i=0; i<iter; i++){
                U = Math.random();
                int j=0;
                while(sum<U){
                    sum += Px[j];
                    Ai = X[j];
                    j++;
                }
                sum = 0;
                sumAi += Ai; // esperance
                sumVar += Ai*Ai; // variance
                //System.out.println("u" + (i+1) + ": " + myRound(U,2) + "     a" + (i+1) + ": " + Ai);
            }
           
            esperance = sumAi/iter;
            variance = sumVar/iter - esperance*esperance;
            System.out.println("\n\nesperance : " + esperance);
            System.out.println("variance : " + variance);
            break;
       
       
        case 2:
            // loi exponentielle
            int lambda = 1;
            double A = 0;
           
            for(int i=0; i<iter; i++){
                U = Math.random();
                A = Math.log(1 - U)/(-lambda);
                //System.out.println("u" + (i+1) + ": " + myRound(U,2) + "     a" + (i+1) + ": " + myRound(A,2));
               
                sumAi += A; // esperance
                sumVar += A*A; // variance
            }

            esperance = sumAi/iter;
            variance = sumVar/iter - esperance*esperance;
            System.out.println("\n\nesperance : " + esperance);
            System.out.println("variance : " + variance);
            break;
            
        case 3:
            // loi Normale
    		
        	
    		// Paramètre de la loi Normal, mu=0 et sigma=1 pour la loi normal centré réduite
    		double mu = 0; 
    		double sigma = 1;
    	    		
    		
    		for(int j=0;j<iter;j++){
    			
    			int i=1;
    			double alpha =0;
    			while(i<iter){
    				i++;
    				alpha+= (Math.random()-0.5)*Math.sqrt(12);
    			}
    			alpha = alpha/Math.sqrt(iter);
    			double Xi=alpha*sigma+mu;
    			esperance+= Xi;
    			variance+= Xi*Xi;
    		}


    		esperance=esperance/iter; //espérance simulé
    		variance=(variance/iter)-esperance*esperance; //variance simulé
            System.out.println("\n\nesperance : " + esperance);
            System.out.println("variance : " + variance);
            System.out.println("\n\nesperance théorique: " + mu);
            System.out.println("variance théorique: " + (sigma*sigma));
            break;
            
        case 4:
            // loi de Poisson

        	lambda=5; // on peut changer le lambda pour avoir une nouvelle espérance et variance car E[X]=Var(X)=lambda

    		

    		for(int j=0;j<iter;j++){
    			U = Math.random();
    			int valeur=0;
    			double cumule=Math.exp(-lambda);
    			double ajout=cumule;
    			while(cumule<U){
    				valeur++;
    				ajout=(ajout*lambda)/valeur;
    				cumule=cumule+ajout;
    			}
    			
    			esperance+= valeur;
    			variance+=(valeur*valeur);
    		}
    		
    		esperance=esperance/iter; //espérance simulé
    		variance=(variance/iter)-esperance*esperance; //variance simulé
    	
    		System.out.println("\n\nesperance : " + esperance);
            System.out.println("variance : " + variance);
    		
    		System.out.println("esperance, variance théorique: Lamda = " +lambda);


            break;
        }

       
    }
   
    private static double myRound(double value, int decimalPlaces)
    {
        if(decimalPlaces < 0) { return value; }
        double augmentation = Math.pow(10, decimalPlaces);
        return Math.round(value * augmentation) / augmentation;
    }

}
