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: 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.
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
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