2017-07-29 8 views
1

J'ai un programme qui est censé trouver une approximation de π en utilisant la méthode de Monte Carlo, et le code est comme ci-dessous:des difficultés à trouver π en utilisant la méthode de Monte Carlo en C++

#include <iostream> 
#include <cstdlib> 
#include <cmath> 

int main() 
{ 
    double x=0, y=0, piEstimate=0, precision=0; 
    int N; 
    int nIn=0, nOut=0; 
    std::cout << "Please enter the seed number." <<std::endl; 
    std::cin >> N; 
    for(int i=0;i<=N;i++){ 
     x=(double)rand()/(double)RAND_MAX; 
     y=(double)rand()/(double)RAND_MAX; 
     if(sqrt(x*x+y*y)>1){ 
      nOut++; 
     }else if(sqrt(x*x+y*y)<1){ 
      nIn++; 
     } 
    } 
    piEstimate=4*(nOut/nIn); 
    std::cout<<"The estimate of pi with "<<N<<" seeds is "<<4.0*(nOut/nIn)<<"."<<std::endl; 
    std::cout<<"Error percentage at "<<abs(100.0-piEstimate/3.1415926)<<"."<<std::endl; 
} 

Ceci, cependant, génère la sortie suivante, ce qui semble déraisonnable: montecarloprogramoutput Quel est le problème ici, et pourquoi le programme génère-t-il de tels nombres inexacts pour π? Je suppose que ma logique échoue quelque part au milieu, mais je ne peux pas savoir où ... Courir dans Code :: Blocks 16, les normes C++ 0X.

+0

Vous devriez appeler 'std :: srand()' exactement * une fois * au début de votre programme pour * ensemencer * le générateur de nombres aléatoires. Pour quelque chose comme ça, il suffit généralement d'utiliser l'heure actuelle: 'std :: srand (std :: time (0));'. Pour des résultats plus précis, vous devriez envisager d'utiliser les fonctions ''. – Galik

+1

Vous n'avez pas besoin de sqrt(). sqrt (v) <= 1 si et seulement si v <= 1. Ne corrigera pas le bug mais vous fera tort plus vite! – Persixty

Répondre

6

La superficie du quart de cercle est

inside = (pi*r^2)/4 
zone

de la place du quartier est

total = r^2 

et la zone du "extérieur"

outside = total - inside = r^2 - (pi*r^2)/4 

Alors vous avez obtenu le formule erronée. Vous devez comparer les essais au total et les essais à l'intérieur, pas à l'extérieur/intérieur:

4* inside/total = pi 

BTW lorsque vous faites et de demander monte carlo la précision que vous ne devriez pas utiliser rand() mais les équipements que vous pouvez trouver dans <random>.

+0

Qu'est-ce que ? Est-ce une bibliothèque? Je ne semble pas voir une telle bibliothèque. –

+0

@NamelessKing sa partie de la bibliothèque standard depuis C++ 11. C'est un peu plus compilé à utiliser que rand(), mais quand vous avez besoin de nombres aléatoires, il vaut vraiment la peine de le regarder – user463035818

+4

C'est en fait ''. –