//***************************************************************************** // Simulation d'une marche aléatoire 2D // Dominique Lefebvre - Octobre 2009 V1.0 // TangenteX // // www.tangenteX.com //****************************************************************************** #include #include #include #include #include using namespace std; // déclaration des constantes #define NBPAS 1000 #define X 0 #define Y 1 #define PI 3.141592654 // 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[]) { FILE *Donnees; char Buffer[20]; int i,ipoint; double Points[NBPAS][2]; // Table de coordonnées des points double d, alpha, x , y; // initialisation du générateur printf("Simulation d'une marche aleatoire 2D" " - Dominique Lefebvre Octobre 2009\n\n"); seed = GenerationSeed(); // initialisation de l'affichage graphique (lib dislin) metafl("XWIN"); disini(); pagera(); pagfll(255); color("black"); hwfont(); titlin("Marche aleatoire 2D",1); graf(0.0,1.0,0.0,0.1,0.0,1.0,0.0,0.1); title(); // initialisation du mouvement color("red"); ipoint = 0; Points[ipoint][X] = 0.5; Points[ipoint][Y] = 0.5; rlstrt(Points[ipoint][X],Points[ipoint][Y]); // plot à l'origine du mouvement // boucle de calcul des points de la marche for(ipoint=1;ipoint 1.0) x = 1.0; if (y > 1.0) y = 1.0; if (x < 0.0) x = 0.0; if (y < 0.0) y = 0.0; // enregistrement des coordonnées Points[ipoint][X] = x; Points[ipoint][Y] = y; rlconn(Points[ipoint][X],Points[ipoint][Y]); // plot le point } // stockage des données dans le fichier Donnees.dat pour affichage // ce fichier est dans le même répertoire que le programme RandomGenerator Donnees = fopen("Donnees.dat","w"); for(i=0;i