//***************************************************************************** // Calcul du nombre Pi par tirages aléatoires // Dominique Lefebvre - Octobre 2009 V1.0 // TangenteX // // www.tangenteX.com //****************************************************************************** #include #include #include #include using namespace std; // déclaration des constantes #define NBTIRAGE 10000000 // déclaration des variables globales long seed; //****************************************************************************** // Génération de nombres aléatoires distribués uniformément entre 0 et 1 // Selon la formule de Lehmer et l'algorithme et les paramètres de // Parker and Miller (1988): // x(i+1) = a*x(i) mod c // Sa période est fixée par c, soit 2^31 - 1 //****************************************************************************** double Random(void) { const double a = 16807.0; // 7^5 const double c = 2147483647.0; // 2^31 - 1 double x,y; x = a*seed; seed = (long)(fmod(x,c)); y = seed/c; // normalisation par c return (y); } //****************************************************************************** // Génération de la constante d'initialisation du générateur Random // à partir de la date courante selon Anderson (1990) //****************************************************************************** long GenerationSeed(void) { struct tm *temps; time_t maintenant; int t0,t1,t2,t3,t4,t5; long lseed; // récupération de l'heure actuelle time(&maintenant); // enregistrement de l'heure actuelle temps = localtime(&maintenant); // conversion en structure tm t0 = temps->tm_sec; t1 = temps->tm_min; t2 = temps->tm_hour; t3 = temps->tm_mday; t4 = temps->tm_mon; t5 = temps->tm_year; // calcul du seed d'après l'algo d'Anderson (seed varie entre 0 et 2^31-1 lseed = t5 + 70*(t4 + 12*(t3 + 31*(t2 + 23*(t1 + 59*t0)))); if ((lseed%2) == 0) lseed = lseed-1; // s'assurer que seed est impair return lseed; } //****************************************************************************** // Programme principal //****************************************************************************** int main(int argc, char *argv[]) { int i, pi4; double x,y,pi; // initialisation du générateur printf("Calcul du nombre PI par tirages aleatoires" " - Dominique Lefebvre Octobre 2009\n\n"); seed = GenerationSeed(); // calcul de PI pi4 = 0; for(i=0;i