2

円周率の近似を求めるプログラムを作ろうとしています。ビュフォンの針法を実装したいと思います。私のプログラムは、0から1およびランダムな角度(0から360)のランダムなx座標を見つけます。[sin(angle)* 1/2 lenght ofneedle]がxより大きい場合、ポジティブトライアルがあります。プログラムは、ループ内で試行回数を数えます。最後の部分は、方程式(針の長さ* n)/ポジティブトライアルを使用して円周率を計算することです。

針の長さ=0.9

間隔=1

n=10000000の結果は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;

}

4

1 に答える 1

5

1つは、sinは度ではなくラジアンを引数として取るため、ランダムな角度は0〜360度であってはなりません。プログラムが

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

0.5ではなく-0.988032を返します。

さらに

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

これは、rand()が「0からRAND_MAXの範囲の疑似乱数を返す」ためです。

于 2012-12-09T20:21:31.673 に答える