pi — Переполнение стопки иглы Буффона

Я пытаюсь сделать программу, чтобы найти приближение числа пи. Я хотел бы реализовать метод иглы Буффона. Моя программа находит случайную координату х от 0 до 1 и случайный угол (от 0 до 360). Если [sin (угол) * 1/2 длины иглы] больше, чем 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;

}

2

Решение

Во-первых, грех принимает в качестве аргумента радианы, а не градусы, поэтому случайный угол не должен быть между 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. Это потому, что rand () «возвращает псевдослучайное целое число в диапазоне от 0 до RAND_MAX».

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]