2012-12-09 19 views
2

我正在試圖做一個程序來找到pi的近似值。我想實施布豐的針法。我的程序找到隨機的x座標形式0到1和隨機角度(0到360)。如果[sin(角度)* 1/2針的長度]大於x,則有正面試驗。該程序使循環中的試驗失敗。最後一部分是使用公式(長針* n)/正實驗來計算pi。布豐的針C++

lenght針= 0.9

間隔= 1

n的結果=千萬是PI = 3,12 ...我無法查找程序中的任何錯誤。我在做什麼不正確?

#include <iostream> 
#include <cstdio> 
#include <cstdlib> 
#include <ctime> 
#include <math.h> 

using namespace std; 

int main() 
{ 
    double x; // x coordinate of needle's center 
    double k; // angle between vertical position and needle 
    double l; // lenght of the needle 
    double n; // amount of trials 
    double p = 0; // positive trials 
    double y; // sin(angle) * l 
    double pi; 
    long i; // loop counter 

srand(time(NULL)); 

cout << "number of trials "; 
cin >> n; 

l = 0.9; 

for (i=0; i<n; i++) 
{ 
    k = (double)rand()/(RAND_MAX)*360;  // random angle 

    x = (double)rand()/(RAND_MAX*2);   // random x (0 do 1) 

    y = (l/2) * sin (k); 


    if (x<=y)          
    { 
     p++;          
    } 

} 

pi = (l*n)/(p); 

cout << "n = "; 
cout << n << endl; 
cout << "p = "; 
cout << p << endl; 

cout << pi; 


return 0; 

}

+2

你應該使用,而不是(它的老ANSI C風格,CMATH是現代) –

回答

5

其一,罪採用弧度作爲參數,而不是度,這樣的隨機角度不應該是0和360度之間。我知道這是因爲該程序

#include <iostream> 
#include <cmath> 
using namespace std; 
int main(void) { 
    cout << sin(30) << endl; 
    return 0; 
} 

回報-0.988032,而不是0.5。

此外

(double)rand()/(RAND_MAX * 2) 

產生0和0.5之間的隨機數,而不是0和1之間。這是因爲蘭特()「返回0和RAND_MAX之間的範圍內的僞隨機整數。」

+0

你的程序無法編譯 錯誤C2668:「罪」:對重載函數 – Ashot

+0

@Ashot曖昧的電話:這是奇怪的,它的工作原理在我的電腦上。我們是否使用相同的編譯器? (我正在使用g ++) –

+0

我在MS Visual Studio 2008上運行它 – Ashot