import java.math.*;

public class main {
	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		// calcul de la moy, esp, var
		quest1();
		// loi de poisson:
		double poiss = 0;
		for(int c = 0; c < 10000;c++)
		{
			poiss += Poisson(4);
		}
		poiss = poiss/10000;
		
		//poisson
		System.out.println("Loi de Poisson: " + poiss);
		
		//Normale
		System.out.println("Normale: " + normal(1000));
		
		//esperance normale
		System.out.println("Esperance de la Loi normale :" + espNormale());
		
		//variance normale
		System.out.println("Variance de la Loi Normale :" + varNormale(1000));
	}

	public static double Poisson(double l)
	{
		double val = Math.exp(-l);
		double val2= val;
		int x=1;
		double rand=Math.random();
		while (val2<rand)
		{
			val = (val * l ) / x;
			val2=val2+val;
			x++;
		}
		return x-1;
	}

	public static double exp(double nb)
	{
		double val = Math.log((1-Math.random())/(-nb));
		return val;
	}


	public static void quest1()
	{
		double Prob[] = {0.2,0.1,0.35,0.15,0.07,0.13};
		double nb[] = {1,2,3,4,5,6};
		double U[] = new double[1000000];
		for (int y=0;y<U.length;y++)
		{
			// remplissage aléatoire du tableau
			U[y]=Math.random();
		}
		int alpha[] = new int[U.length]; // creattion d'un tab de la taille du tableau U
		double somme=0;
		int i=0;

		for (int j=0;j<U.length;j++)
		{
			i=0;
			somme=0;
			while (somme<U[j])
			{
				somme=somme+Prob[i];
				i++;
			}
			alpha[j]=i;

		}

		// calcul de la moy
		double tot=0;
		for (int k=0;k<U.length;k++)
		{
			tot=tot+alpha[k];
		}
		double moyenne = (tot)/U.length;

		//////// calcul de l'espérance
		double tot2=0;
		for (int l=0;l<6;l++)
		{
			tot2=tot2+Prob[l]*nb[l];
		}

		//////// calcul de la variance
		double var=0;
		for (int l=0;l<Prob.length;l++)
		{
			var=var+Prob[l]*nb[l]*nb[l];
		}
		var=var-tot*tot;

	}


	public static double normal(int n)
	{
		int i = 1;
		double cumul = 0;
		while(i<n)
		{
			cumul+= Math.random();
			i++;
		}
		double A = ((cumul/n-0.5)*Math.sqrt(12)*Math.sqrt(n));
		return A;
	}

	public static double espNormale()
	{
		double p = 0;
		for(int c = 0; c < 10000; c++)
		{
			p += normal(1000);
		}
		p = p/10000;
		return p;
	}

	public static double alpha () 
	{
		int iteration = 10000;
		int i = 1;
		double cumul = 0;
		while (i<iteration) 
		{
			cumul += Math.random();
			i++ ;
		}
		double alpha = (cumul/iteration -0.5)*(Math.sqrt(12))*(Math.sqrt(iteration));
		return alpha;
	}

	public static double varNormale(int n)
	{
		double esp = 0;
		double var = 0;
		int i = 0;
		while(i<n)
		{
			i++;
			esp += alpha();
			var = var + Math.pow(alpha(), 2);
		}
		esp = (esp/n);
		var = (var/n)-(esp*esp);
		return var;
	}
}
