import umontreal.iro.lecuyer.rng.*; import umontreal.iro.lecuyer.probdist.*; import umontreal.iro.lecuyer.randvar.*; import umontreal.iro.lecuyer.charts.*; import umontreal.iro.lecuyer.stat.*; /** * Programme générant une courbe de densité et un histogramme. */ public class Normals2 { 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 Normals2 "); 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 // Possibilité de mettre un autre stream, comme LFSR113 au lieu de MRG32k3a RandomStream rs = new MRG32k3a(); // Utilise Acceptance-complement ratio pour générer les normales // On peut revenir à l'inversion en remplaçant NormalACRGen par NormalGen. NormalGen ngen = new NormalACRGen (rs, mu, sigma); // 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 // ngen.nextDouble() produit des normales // 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++) { // On n'a pas à se soucier ici de comment les normales sont générées double x = ngen.nextDouble(); statValues.add (x); } // 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); } }