Approximation pi par la méthode de monte carlo

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 916 fois - Téléchargée 22 fois

Contenu du snippet

programme qui donne une estimation de pi selon la méthode de monte carlo
                                                                                                                                    • /

/*** Approximation de pi par la méthode de monte carlo ***/
/*** crée par blackbird ***/
//-principe :
//--> un cercle est circonscrit dans un carré.
// la surafce du cercle / la surface du carré = pi / 4
//--> on remplit le carré par des points (surafce du carré)
// et on compte le nombre de points dans le cercle (surface
// du cercle).
// leurs rapport = pi / 4
//--> plus le nombre de points est élévé plus on s'approche de la
// valeur de pi
/******************************************************************/

Source / Exemple :


/******************************************************************/
/***      Approximation de pi par la méthode de monte carlo     ***/
/***                       crée par blackbird                   ***/
//-principe : 
//--> un cercle est circonscrit dans un carré.
//    la surafce du cercle / la surface du carré = pi / 4
//--> on remplit le carré par des points (surafce du carré)
//    et on compte le nombre de points dans le cercle (surface 
//    du cercle).
//    leurs rapport = pi / 4
//--> plus le nombre de points est élévé plus on s'approche de la 
//    valeur de pi
/******************************************************************/

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <conio.h>
#include <ctype.h>
#include <windows.h>

int main() {

	int Rep;

	float NbrePoint,CoordonneeX,CoordonneeY;
	float NbrePointDansCercle = 0 ,Compteur = 1;
	
	LARGE_INTEGER Debut,Fin,Frequence;
	double Duree;

	//
	//saisie du nombre de points total.
	//
	printf("Donner le nombre de points total :\n");
	scanf("%f",&NbrePoint);
	//

	QueryPerformanceFrequency(&Frequence);
	QueryPerformanceCounter(&Debut);

	//
	//extraire aléatoirement un point de coordonnées X et Y
	//si X²+Y² < 1 donc le point est dans le cercle
	//sinon elle est dans le carré.
	//
	srand(time(NULL));
	do {
		CoordonneeX = rand()/(RAND_MAX+1.0);
		CoordonneeY = rand()/(RAND_MAX+1.0);
		if (CoordonneeX * CoordonneeX + CoordonneeY * CoordonneeY < 1)
			NbrePointDansCercle ++;
		printf("PI = %10f\n",4*NbrePointDansCercle / NbrePoint);
			Compteur++;
	}while(Compteur<=NbrePoint);
	//
    
	QueryPerformanceCounter(&Fin);
	Duree = (1000.0 * (Fin.QuadPart - Debut.QuadPart) / Frequence.QuadPart );
	printf("\n		Ex%ccut%c en %0.3f secondes\n",130,130,Duree/1000);

	printf("\n\nTaper sur Entr%ce pour continuer.\nTaper sur une autre pour quitter\n\n\n",130);
       Rep = _getch();
	   if (__toascii(Rep) == 13)  {system("cls");main();}
	   else exit(EXIT_SUCCESS);
}

A voir également

Ajouter un commentaire Commentaire
lynxtyle Messages postés 79 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 31 octobre 2011 2
4 mars 2008 à 11:36
Petite chose que j'apprécis pas beaucoup c'est le titre donné dans le code : "Approximation de pi par la méthode de monte carlo crée par blackbird"
tu pourrais au moins par humilité mettre : "Approximation de pi par blackbird grace à la méthode de monte carlo"

Tu peux aussi retirer des includes stdlib.h car tu n'y fait jamais appel...

Après coté performances (vu que tu utilise le QueryPerformance c'est que tu dois la rechercher) tu as le printf qui est très gourmand en temps d'exécution... donc donner le résultat qu'à la fin te ferait gagner beaucoup de temps d'exécution ! (et pas qu'un peu si tu souhaite obtenir une approximation précise) Mais si tu souhaite pouvoir afficher périodiquement l'approximation actuel implémente un peu de directx ou opengl à ton application (ainsi le gros de exécution de l'affichage est pris en charge par le processeur de ta carte graphique... c'est performant et en plus tu peux avoir à l'écran un truc sympa et surtout ça rend fou les prof à l'université, qui ne connaissent pas la programmation de moteur graphique, quand ils voyent même pas de différence de temps d'exécution entre avec et sans l'affichage périodique du résultat actuel^^)

Enfin pour ce qui s'intêresse à pi cette méthode statistique n'est pas la plus performante mais elle à l'avantage d'avoir son résultat facilement réutilisable et de pouvoir être facilement déployé sur un réseau :

srand(time(NULL));
do {
CoordonneeX = rand()/(RAND_MAX+1.0);
CoordonneeY = rand()/(RAND_MAX+1.0);
if (CoordonneeX * CoordonneeX + CoordonneeY * CoordonneeY < 1)
NbrePointDansCercle ++;
Compteur++;
}while(Compteur<=NbrePoint);

et on sauvegarde NbrePointDansCercle et Compteur qu'on peut par exemple récupérer par réseau depuis tout plein d'ordinateur... le serveur n'ayant plus qu'à faire le calcul final (c'est aussi une partie très sympa à étudier vu que le but est de rechercher le plus grand nombre significatif de pi... donc les tailles de variables classiques sont dépassées ce qui peu être résolu avec un tableau...)
on rajoute au projet le multithread et on en fait un écran de veille en remplaçant "while(Compteur<=NbrePoint);" par temps que la souris bouge pas... puis envois des 2 variables sur un serveur web... ça peu faire un projet sympa^^ mais ça restera tout de même une méthode très peu performante pour calculer pi ;)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.