

Помогите плиз, супер программисты. Не знаю как написать
17 задача.
вот расчеты круга может пригодятся:
if (x * x + y * y <= 1 && !(x >= 0 && x <= 1 && y >= 0 && y <= 1)) cout << "Oblast popadaniya: A" << endl;
if (x * x + y * y >= 1 && x * x + y * y <= 4 && !(x >= 0 && x <= 2 && y >= 0 && y <= 2)) cout << "Oblast popadaniya: B"<<endl;
if (x * x + y * y <= 1 && x >= 0 && x <= 1 && y >= 0 && y <= 1) cout << "Oblast popadaniya: C" << endl;
if (x * x + y * y >= 4 || x * x + y * y >= 1 && x >= 0 && x <= 1 && y >= 0 && y <= 1) cout << "Oblast popadaniya: D" << endl;
Метод Монте Карло это когда используют ковровые бомбардировки, а потом по результатам оценивают что там было?
А если серьезно, то тебе надо выбрать область, обрамляющую твою фигуру, внутри которой тебе нужно иметь равномерное распределение точки или маленького объекта.
Предлагаю использовать квадрат со стороной 6. Затем взять много точек, посчитать сколько из них попадет внутрь фигуры и масштабировать относительно площади квадрата и общего числа точек
Тут 2 варианта:
1. взять много (тысяч 10) пар (x, y), x и y каждый раз выбираются случайно [-3.0, 3.0]
2. разбить квадрат на решетку: пары (x, y) брать последовательно с шагом 1/100 от ширины квадрата
Второй способ использовать для того, чтобы оценить, действительно ли распределение получится равномерным.
ЗЫ. категорически не рекомендую использовать ваши формулы, даже если они правильные:
- замените целые числа на вещественные (1 ->1.0)
- я бы использовал 3 условия:
1. попадание в сектор, в котором зона С: x>=0.0 && y>=0
2. попадание в большой круг: x*x + y*y <= 2.0
3. попадание в маленький круг: x*x + y*y <= 1.0
потом просто комбинировал эти условия
C++, к сожалению, не знаю, а на С вот, пожалуйста:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
// проверка попадания точки в интересующие нас области
int isPointIn(float x, float y)
{
float r2 = x*x+y*y;
// область попадания - B
if ((x <= 0 || y <= 0) && (r2 >= 1 && r2 <= 4))
return 1;
// область попадания - C
if ((x >= 0 && y >= 0) && (r2 <= 1))
return 1;
// ничего не подошло
return 0;
}
void main()
{
int Nmax = 50000;
int N = 0;
int i;
float x, y;
// инициализируем датчик случайных чисел
srand(time(NULL));
// производим Nmax испытаний
for (i = 0; i < Nmax; i++)
{
// выбираем случайную точку в квадрате [-2;2]x[-2;2]
x = rand()*4.0 / RAND_MAX - 2.0,
y = rand()*4.0 / RAND_MAX - 2.0;
// проверяем попадание в нужные области
if (isPointIn(x, y)) N++;
}
// выводим результат
printf("Monte-Carlo: %f\n", 16.0 * N / Nmax);
printf("Exact value: %f\n", (M_PI * 2.0 * 2.0 - M_PI) * 3.0/4.0 + M_PI/4.0 );
}