import umontreal.iro.lecuyer.rng.*; import umontreal.iro.lecuyer.probdist.*; import umontreal.iro.lecuyer.charts.*; import umontreal.iro.lecuyer.stat.*; /** * Programme générant une courbe de densité et un histogramme. */ public class Normals { public static void main (String[] args) { // Lecture des paramètres entrés sur la ligne de commande if (args.length != 3) { System.err.println ("Usage: java Normals "); System.exit (1); } double mu = Double.parseDouble (args[0]); double sigma = Double.parseDouble (args[1]); int n = Integer.parseInt (args[2]); // Création d'un générateur de nombres aléatoires uniformes RandomStream rs = new MRG32k3a(); // rs.nextDouble() permet de générer un uniforme sur [0,1) tandis que // rs.nextInt(a,b) génère un entier uniforme sur a,...,b // Construit un objet représentant la loi normale avec moyenne mu et // écart-type sigma. NormalDist dist = new NormalDist (mu, sigma); // Affiche un graphique de la densité normale double a = mu - 5*sigma; double b = mu + 5*sigma; new ContinuousDistChart (dist, a, b, 1000).viewDensity (800, 600); // Création d'un collecteur statistique qui mémorise les observations TallyStore statValues = new TallyStore ("Mean of observations", n); // Génère des points selon la loi normale for (int i = 0; i < n; i++) { // Génère une uniforme sur [0,1) double u = rs.nextDouble(); // Génère une normale par inversion statValues.add (dist.inverseF (u)); } // Affiche un rapport statistique System.out.println (statValues.reportAndCIStudent (0.95)); // Affiche un histogramme des observations // Le tableau retourné par statValues.getArray() a une taille // supérieure ou égale au nombre d'observations et peut donc // contenir des éléments invalides. // Il faut donc passer l'objet retourné par // getDoubleArrayList() qui encapsule le nombre d'observations // en plus d'un tableau. new HistogramChart ("Histogramme de densité d'une normale", "X", "Nombre d'obs.", statValues.getDoubleArrayList()).view (800, 600); } }