Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Вычисление площади методом Монте-Карло - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как окрасить в цвет фигуру, траекторию, область http://www.cyberforum.ru/cpp-beginners/thread694650.html
Как мне передать все значения моих точек в одно поле, которому в последствие мы зададим цвет, учитывая способы рисования моей траектории и фигуры?
C++ Разработать битовое поле, описывающее состояния элементов прибора Задание: Разработать битовое поле, описывающее состояния элементов прибора. Ввести с консоли число в 16-ричной системе счисления, преобразовать его в битовое поле за счёт использования объединения.... http://www.cyberforum.ru/cpp-beginners/thread694649.html
Создание двумерного динамического массива C++
Нужно разработать консольное приложение в Visual Studio (использую 2010), которое вводит c клавиатуры двумерный массив целых чисел. Вот сам код. #include "stdafx.h" #include <iostream> using...
C++ Сделать блок схему
помогите пожалуйста (надо блок схему) Получить действительную матрицу a i,j=1,...n, первая строка которой задается формулой aij=2j+3(j=1...n) вторая строка задается формулой a2j=j-3/2+1/j(j=1,...n),...
C++ Матрица из StringGrid: найти количество положительных элементов http://www.cyberforum.ru/cpp-beginners/thread694625.html
Ввести матрицу в StringGrid 6x3 и вывести количество ее положительных элементов.
C++ Найти в тексте заданное слово и добавить новое перед ним У меня есть прога. Суть ее в том что она из текстового файла читает информацию и обрабатывает ее(в строке по одному слову), она когда находит слово "паскаль", перед ним вставляет слово "язык" (на... подробнее

Показать сообщение отдельно
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
19.11.2012, 16:10
Вот теперь программа похожа на правду.
Рекомендации:
- квадрат a проще и эффективнее записать как a*a;
- воспользоваться тем, что x1 = y2 и x2 = y1;
- сократить ненужные и повторяющиеся вычисления;
- использовать double вместо float;
- объявлять переменные там, где они используются впервые;
- написать RandFloat с использованием стандартного rand;
- написать InsideFigure.
Для простоты предположим положительное a
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main() {
    double a = 0;
    cin >> a;   // В дальнейшем нам может понадобиться проверка введённого значения, но сейчас предположим, оно заведомо корректно.
    const double b0 = a/2, b1 = a*2; // Диапазон (одинаковый по осям x и y)
    const double S0 = (b1 - b0)*(b1 - b0);  // Площадь квадрата, в который вписана фигура
    const int N = 100000;  // Общее количество точек
    int n = 0;   // Количество точек внутри фигуры
    for(int i=0; i < N; ++i)
        if(InsideFigure(RandFloat(b0, b1), RandFloat(b0, b1)))  // Проверяем пару координат на принадлежность фигуре
            ++n;  // Увеличиваем счётчик
    cout << "Monte-Carlo area: " << (S0 * n) / N << endl;
    cout << "Exact area: " << (1.875 - 2*log(2))*a*a << endl;
}
По поводу случайных чисел: функция rand возвращает целые значения в диапазоне от 0 до достаточно большого числа, определённого константой RAND_MAX. Преобразовать такое число в вещественное в заданном диапазоне (основная цель RandFloat) несложно.

Проверка принадлежности InsideFigure - функция, возвращающая значение bool и проверяющая соблюдение описанных выше условий.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru