我正在处理一份非常典型的大学作业。我需要使用蒙特卡罗方法通过Buffon Needle来编写一个C程序以估算圆周率。我认为我的程序可以正常运行,但我从未正确地得到过π。它总是接近典型的3.14,但有时它是3.148910,有时是3.13894。这背后的原因是什么?我能做些什么使其更加“接近”准确值吗? (代码注释为波兰语,英文注释在括号内。)
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
srand(time(NULL));
int i; //wprowadzenie licznika (counter)
double l; // dlugosc igly (lenght of needle)
double n;// liczba prob (number of trials)
double L; // szerokosc miedzy liniami (width between lines)
double x; // kat miedzy igla a normalna do linii (angle)
double pi; // szacowana wartosc liczby pi (pi)
double P=0; //ilość prób spełniających warunek styku igły z linią (ammount of trials that worked)
double d; //odleglosc srodka igly od linii (distance between centre of needle and line)
double y; //minimalizacja obliczeń
double stosun; //stosunek wykonanych obliczeń (ammount of trials to ammount of succesfull trials)
printf("Program szacuje wartosc liczby pi metoda Monte Carlo na podstawie Igly Buffona. Prosze Pamietac o:\n-Podaniu liczby prób jako wartości większej od zera i całkowitej\n-Podaniu długości igły mniejszej niż szerokości między liniami\n");
printf("Prosze podac liczbe prob:\n");
scanf("%lf", &n);
printf("Prosze podac dlugosc igly:\n");
scanf( "%lf", &l);
printf("Prosze podac szerokość miedzy liniami:\n");
scanf("%lf", &L);
if (n <= 0.0 || l > L)
{
printf("Nastąpił błąd wynikających z podania niepoprawnych danych\n");
return 1;
}
printf("%f %f %f", n,l,L); //debuging midway
for (i=0; i<n; i++)
{
x = ((double)rand()/RAND_MAX)*3.1415; // losowy kat w radianach (random angle in radians)
d = ((double)rand()/RAND_MAX)*L/2; // losowa dlugosc igly mniejsza niz odstep miedzy liniami (random needle lenght)
y = (l/2) * sin (x);
printf("Próba%d\n", i);
if (d<=y)
{
P++;
}
}
stosun=n/P;
printf("Stosun %lf", stosun);
pi=stosun*2*l/L;
printf("liczba pi=%lf", pi);
return 0;
}
n
是多少?(顺便说一下,在任何情况下都不要将整数计数器的上限变为double
!!) - The Veegcc
,至少使用:-Wall -Wextra -pedantic
,我还使用:-Wconversion -std=gnu99
)作为帮助,当不使用main()
的参数时,请使用int main( void )
签名。 - user3629249